Lớp java.util.regex.Matcher đại diện cho một engine thực hiện các phép toán khớp khác nhau. Không có constructor cho lớp này, bạn có thể tạo/nhận đối tượng của lớp này bằng phương thức matcher() của lớp java.util.regex.Pattern.
Anchoring bounds (ranh giới neo) được dùng để khớp các ranh giới vùng như ^ và $. Mặc định, một matcher sử dụng anchoring bounds.
Phương thức useAnchoringBounds() của lớp này chấp nhận giá trị boolean. Nếu truyền true, matcher hiện tại dùng anchoring bounds; nếu false, dùng non-anchoring bounds.
Ví dụ 1: Tắt anchoring bounds
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Trail {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
System.out.println("Nhập chuỗi đầu vào");
String input = sc.nextLine();
// Regex tìm chữ số
String regex = ".*\\d+.*";
Pattern pattern = Pattern.compile(regex);
System.out.println("Biểu thức chính quy đã biên dịch: " + pattern.toString());
Matcher matcher = pattern.matcher(input);
matcher.useAnchoringBounds(false);
boolean hasBounds = matcher.hasAnchoringBounds();
if (hasBounds) {
System.out.println("Matcher hiện tại dùng anchoring bounds");
} else {
System.out.println("Matcher hiện tại dùng non-anchoring bounds");
}
}
}
Kết quả
Nhập chuỗi đầu vào sample Biểu thức chính quy đã biên dịch: .*\d+.* Matcher hiện tại dùng non-anchoring bounds
Ví dụ 2: Ảnh hưởng của anchoring bounds với ^
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Sample {
public static void main(String args[]) {
String regex = "^<foo>.*";
String input = "<foo><bar>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// Tắt anchoring bounds
matcher = matcher.useAnchoringBounds(false);
if (matcher.matches()) {
System.out.println("Tìm thấy khớp");
} else {
System.out.println("Không tìm thấy khớp");
}
System.out.println("Has anchoring bounds: " + matcher.hasAnchoringBounds());
}
}
Kết quả
Tìm thấy khớp Has anchoring bounds: false
Giải thích: Khi tắt anchoring bounds, ^ không còn khớp đầu vùng (region start) mà khớp đầu toàn bộ chuỗi, nên ^<foo>.* khớp với <foo><bar> ngay cả khi region không bắt đầu từ 0.