Lớp Matcher (Class Matcher)
Lớp Matcher trong Java là một phần của gói java.util.regex, được sử dụng để thực hiện các thao tác khớp trên một chuỗi ký tự bằng cách giải thích một mẫu (Pattern). Một matcher được tạo ra từ một pattern bằng cách gọi phương thức matcher của pattern đó và cung cấp nhiều phương thức để tìm kiếm, so khớp và thao tác với các chuỗi dựa trên các biểu thức chính quy. Một khi được tạo, một matcher có thể được sử dụng để thực hiện ba loại hoạt động khớp khác nhau:
↳ matches(): Thử khớp toàn bộ chuỗi đầu vào với mẫu.
↳ lookingAt(): Thử khớp chuỗi đầu vào, bắt đầu từ đầu, với mẫu.
↳ find(): Quét chuỗi đầu vào để tìm chuỗi con tiếp theo khớp với mẫu.
↳ Lưu ý: lớp này không an toàn cho sử dụng đa luồng.
Để sử dụng lớp Matcher trong gói java.util.regex, bạn cần thêm câu lệnh import vào đầu file Java của mình.
Cú pháp câu lệnh import
import java.util.regex.Matcher;
Tạo một đối tượng Matcher
Để tạo một đối tượng Matcher, bạn cần có một đối tượng Pattern (biểu diễn một biểu thức chính quy đã được biên dịch). Sau đó, gọi phương thức matcher() của Pattern để tạo ra một Matcher.
Ví dụ: Example.java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern pattern = Pattern.compile("\d+"); // Tìm kiếm một hoặc nhiều chữ số
Matcher matcher = pattern.matcher("My number is 12345");
Phương thức của lớp Matcher
lớp Matcher cung cấp nhiều phương thức để tìm kiếm và so khớp biểu thức chính quy. Việc phân nhóm các phương thức theo chức năng sẽ giúp bạn hiểu rõ hơn về cách sử dụng lớp Matcher. Dưới đây là cách phân nhóm các phương thức phổ biến của lớp lớp Matcher:
Phương thức tìm kiếm và khớp
↳ find(): Tìm kiếm sự khớp tiếp theo trong chuỗi.
↳ find(int start): Tìm kiếm sự khớp tiếp theo bắt đầu từ vị trí chỉ định.
↳ lookingAt(): Kiểm tra xem phần đầu của chuỗi có khớp với mẫu không.
↳ matches(): Kiểm tra xem toàn bộ chuỗi có khớp với mẫu không.
Chức năng: Các phương thức này được sử dụng để tìm kiếm các phần tử trong chuỗi phù hợp với mẫu regex đã định.
Phương thức truy xuất thông tin về khớp
↳ start(), end(): Trả về vị trí bắt đầu và kết thúc của khớp.
↳ start(int group), end(int group): Trả về vị trí bắt đầu và kết thúc của một nhóm bắt giữ cụ thể.
↳ group(): Trả về chuỗi khớp toàn bộ.
↳ group(int group): Trả về chuỗi của một nhóm bắt giữ cụ thể.
↳ groupCount(): Trả về số lượng nhóm bắt giữ trong mẫu.
Chức năng: Các phương thức này giúp bạn truy xuất thông tin chi tiết về các phần khớp, bao gồm vị trí và nội dung của chúng.
Phương thức thay thế
↳ appendReplacement(StringBuffer sb, String replacement): Thêm chuỗi đầu vào cho đến vị trí bắt đầu của khớp cuối cùng vào StringBuffer, sau đó thêm chuỗi thay thế.
↳ appendReplacement(StringBuilder sb, String replacement): Tương tự như trên nhưng sử dụng StringBuilder.
↳ appendTail(StringBuffer sb): Thêm phần còn lại của chuỗi đầu vào vào StringBuffer.
↳ appendTail(StringBuilder sb): Tương tự như trên nhưng sử dụng StringBuilder.
↳ replaceAll(String replacement): Thay thế tất cả các khớp trong chuỗi đầu vào bằng chuỗi thay thế.
↳ replaceAll(Function<MatchResult,String> replacer): Thay thế tất cả các khớp trong chuỗi đầu vào bằng kết quả của việc áp dụng hàm replacer cho mỗi khớp.
↳ replaceFirst(String replacement): Thay thế khớp đầu tiên trong chuỗi đầu vào bằng chuỗi thay thế.
↳ replaceFirst(Function<MatchResult,String> replacer): Thay thế khớp đầu tiên trong chuỗi đầu vào bằng kết quả của việc áp dụng hàm replacer cho khớp đầu tiên.
Chức năng: Các phương thức này được sử dụng để thay thế các phần của chuỗi khớp với mẫu bằng một chuỗi khác hoặc bằng kết quả của một hàm. chúng.
Phương thức điều khiển và cấu hình
↳ reset(): Đặt lại matcher.
↳ reset(CharSequence input): Đặt lại matcher với một chuỗi đầu vào mới.
↳ usePattern(Pattern newPattern): Thay đổi mẫu được sử dụng bởi matcher.
↳ region(int start, int end): Thiết lập giới hạn của region cho matcher.
↳ regionStart(), regionEnd(): Trả về vị trí bắt đầu và kết thúc của region.
↳ hasAnchoringBounds(), hasTransparentBounds(): Kiểm tra các thuộc tính của giới hạn region.
↳ useAnchoringBounds(boolean b), useTransparentBounds(boolean b): Thiết lập các thuộc tính của giới hạn region.
Chức năng: Các phương thức này được sử dụng để điều khiển hành vi của matcher, chẳng hạn như đặt lại matcher, thay đổi mẫu, thiết lập giới hạn tìm kiếm.
Các phương thức khác
↳ hitEnd(): Kiểm tra xem đã đạt đến cuối chuỗi đầu vào trong lần tìm kiếm cuối cùng không.
↳ pattern(): Trả về mẫu được sử dụng bởi matcher.
↳ results(): Trả về một stream các kết quả khớp cho mỗi chuỗi con của chuỗi đầu vào khớp với mẫu.
↳ toMatchResult(): Trả về trạng thái khớp của matcher dưới dạng MatchResult.
↳ toString(): Trả về biểu diễn chuỗi của matcher.
↳ requireEnd(): Trả về true nếu thêm đầu vào có thể thay đổi một khớp dương thành khớp âm.
Dưới đây là một ví dụ minh họa cách sử dụng một số phương thức quan trọng của lớp Matcher trong java:
Ví dụ: Example.java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
// Chuỗi đầu vào
String input = "Ngày sinh của tôi là 06/02/1997";
// Biểu thức chính quy để khớp với ngày tháng năm
String regex = "(\d{2})/(\d{2})/(\d{4})";
// Tạo đối tượng Pattern từ biểu thức chính quy
Pattern pattern = Pattern.compile(regex);
// Tạo đối tượng Matcher để tìm kiếm trong chuỗi đầu vào
Matcher matcher = pattern.matcher(input);
// Tìm kiếm các lần khớp
if (matcher.find()) {
// Trả về chuỗi khớp đầy đủ
System.out.println("Chuỗi khớp: " + matcher.group());
// Vị trí bắt đầu và kết thúc của lần khớp
System.out.println("Vị trí bắt đầu: " + matcher.start());
System.out.println("Vị trí kết thúc: " + matcher.end());
// In ra các nhóm con của lần khớp
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Nhóm " + i + ": " + matcher.group(i));
System.out.println("Vị trí bắt đầu của nhóm " + i + ": " + matcher.start(i));
System.out.println("Vị trí kết thúc của nhóm " + i + ": " + matcher.end(i));
}
} else {
System.out.println("Không tìm thấy chuỗi khớp.");
}
// Kiểm tra khớp toàn bộ chuỗi
boolean matches = matcher.matches();
System.out.println("Toàn bộ chuỗi khớp: " + matches);
// Thay thế tất cả các phần khớp
matcher.reset(); // Đặt lại matcher để tìm kiếm lại
String replacedAll = matcher.replaceAll("ngày/tháng/năm");
System.out.println("Thay thế tất cả: " + replacedAll);
// Thay thế phần khớp đầu tiên
matcher.reset(); // Đặt lại matcher để tìm kiếm lại
String replacedFirst = matcher.replaceFirst("ngày/tháng/năm");
System.out.println("Thay thế phần khớp đầu tiên: " + replacedFirst);
}
}
Kết quả của chương trình là:
Vị trí bắt đầu: 21
Vị trí kết thúc: 31
Nhóm 1: 06
Vị trí bắt đầu của nhóm 1: 21
Vị trí kết thúc của nhóm 1: 23
Nhóm 2: 02
Vị trí bắt đầu của nhóm 2: 24
Vị trí kết thúc của nhóm 2: 26
Nhóm 3: 1997
Vị trí bắt đầu của nhóm 3: 27
Vị trí kết thúc của nhóm 3: 31
Toàn bộ chuỗi khớp: false
Thay thế tất cả: Ngày sinh của tôi là ngày/tháng/năm
Thay thế phần khớp đầu tiên: Ngày sinh của tôi là ngày/tháng/năm
Ví dụ này minh họa cách sử dụng các phương thức quan trọng của lớp Matcher để tìm kiếm, khớp, và thao tác với chuỗi dựa trên các biểu thức chính quy trong Java.