Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Phương thức Matcher.useAnchoringBounds() trong Java với ví dụ


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.