So khớp mẫu bằng Regex
Thuộc phần Logic và luồng chương trình trong hành trình Java của Coddy. Bài học 47 trên 59.
Các lớp Pattern và Matcher cung cấp công cụ mạnh mẽ để thao tác với biểu thức chính quy trong Java. Trước tiên, hãy tìm hiểu cách sử dụng chúng:
Tạo một pattern bằng Pattern.compile():
Pattern pattern = Pattern.compile("cat");
// Tạo một mẫu để tìm "cat"Tạo một matcher cho văn bản của bạn:
String text = "The cat and dog";
Matcher matcher = pattern.matcher(text);
// Tạo đối tượng so khớp cho textBây giờ bạn có thể tìm các kết quả khớp bằng matcher.find():
while (matcher.find()) {
System.out.println("Found at: " + matcher.start());
}Sau khi chạy đoạn code trên, đầu ra là: Found at: 4
Hiểu các phương thức:
matcher.find()- Tìm lần xuất hiện tiếp theo của mẫu trong văn bản- Trả về
truenếu tìm thấy kết quả khớp - Trả về
falsenếu không còn kết quả khớp nào - Đó là lý do ta dùng phương thức này trong vòng lặp
whileđể tìm tất cả các lần xuất hiện
- Trả về
matcher.start()- Trả về chỉ số bắt đầu (vị trí) của kết quả khớp cuối cùng được tìm thấy bằngfind()- Trong ví dụ này, "cat" bắt đầu ở chỉ số 4 trong "The cat and dog"
- Phải gọi phương thức này sau khi
find()chạy thành công
Ví dụ có nhiều kết quả khớp:
Pattern pattern = Pattern.compile("cat");
Matcher matcher = pattern.matcher("cat and cat");
while (matcher.find()) {
System.out.println("Found at: " + matcher.start());
}
// Đầu ra:
// Found at: 0
// Found at: 8Thử thách
DễTạo một phương thức tên là findWords nhận hai đối số:
- Một chuỗi (
text) để tìm kiếm trong đó - Một chuỗi (
word) cần tìm
Phương thức cần:
- Dùng Pattern và Matcher để tìm tất cả các lần xuất hiện của từ
- Trả về một chuỗi chứa các vị trí tìm thấy từ đó
- Các vị trí được phân tách bằng dấu cách
Thông báo trả về cần là:
- Nếu đầu vào nào là null: trả về "Invalid input"
- Nếu không tìm thấy từ: trả về "Not found"
- Nếu tìm thấy: trả về các vị trí (ví dụ: "4 10 15")
Tự làm thử
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static String findWords(String text, String word) {
// Viết code tại đây
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
String word = scanner.nextLine();
if (text.equals("null")) text = null;
if (word.equals("null")) word = null;
System.out.println(findWords(text, word));
}
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Mảng đa chiều
Kiến thức cơ bản về mảng 2DTruy cập phần tử trong mảng 2DVòng lặp lồng nhau với mảng 2DÔn tập về mảng 2DPhép cộng và phép trừ ma trậnMảng không đềuMảng 3D trở lênCác mẫu thường gặp với mảng 2DÔn tập về mảng2HashMap phần 1
HashMap là gì?Khai báo HashMapTruy cập giá trịKiểm tra khóa có tồn tạiChỉnh sửa từ điểnÔn tập: HashMap5HashSet phần 2
Toán học: hợp của các HashSetToán học: giao của HashSetToán học: hiệu tập hợpToán học: hiệu đối xứngTập con và tập chaDuyệt qua các tập hợp8Thao tác chuỗi nâng cao
Kiến thức cơ bản về StringBuilderGiới thiệu về StringBufferKiến thức cơ bản về biểu thức chính quySo khớp mẫu bằng RegexStringTokenizerĐịnh dạng chuỗi nâng caoTự luyện tập: Trình biên dịch Java online
Thử một mẫu trên văn bản của bạn: Công cụ kiểm tra regex