Menu
CoddyTech

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 text

Bâ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ề true nếu tìm thấy kết quả khớp
    • Trả về false nế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
  • 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ằng find()
    • 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: 8
challenge icon

Thử thách

Dễ

Tạo một phương thức tên là findWords nhận hai đối số:

  1. Một chuỗi (text) để tìm kiếm trong đó
  2. Một chuỗi (word) cần tìm

Phương thức cần:

  1. Dùng Pattern và Matcher để tìm tất cả các lần xuất hiện của từ
  2. Trả về một chuỗi chứa các vị trí tìm thấy từ đó
  3. 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));
    }
}
quiz iconTự kiểm tra

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

Tự 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