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

Phương thức Matcher.useTransparentBounds() 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.

Trong biểu thức chính quy, các cấu trúc lookbehind và lookahead được dùng để khớp một pattern cụ thể đi trước hoặc đi sau pattern khác. Ví dụ, nếu bạn cần chấp nhận chuỗi 5-12 ký tự, regex sẽ là:

"\\A(?=\\w{6,10}\\z)"

Mặc định, ranh giới vùng (region) của matcher không trong suốt (non-transparent) đối với các cấu trúc lookahead, lookbehind và khớp ranh giới, tức là các cấu trúc này không thể khớp nội dung văn bản đầu vào vượt quá ranh giới vùng.

Ví dụ 1: Không dùng transparent bounds

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class useTransparentBoundsExample {
    public static void main(String[] args) {
        // Regex chấp nhận 6-10 ký tự
        String regex = "\\A(?=\\w{6,10}\\z)";
        System.out.println("Nhập 5 đến 12 ký tự: ");
        String input = new Scanner(System.in).next();
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        // Đặt region chỉ 4 ký tự đầu
        matcher.region(0, 4);
        
        if (matcher.find()) {
            System.out.println("Tìm thấy khớp");
        } else {
            System.out.println("Không tìm thấy khớp");
        }
    }
}

Kết quả

Nhập 5 đến 12 ký tự: sampleText
Không tìm thấy khớp

Phương thức useTransparentBounds() 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 transparent bounds (ranh giới trong suốt); nếu false, dùng non-transparent bounds.

Ví dụ 2: Sử dụng transparent bounds

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    public static void main(String[] args) {
        String regex = "\\A(?=\\w{6,10}\\z)";
        System.out.println("Nhập 5 đến 12 ký tự: ");
        String input = new Scanner(System.in).next();
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        // Đặt region chỉ 4 ký tự đầu
        matcher.region(0, 4);
        
        // Bật transparent bounds
        matcher = matcher.useTransparentBounds(true);
        
        if (matcher.find()) {
            System.out.println("Tìm thấy khớp");
        } else {
            System.out.println("Không tìm thấy khớp");
        }
    }
}

Kết quả

Nhập 5 đến 12 ký tự: sampletext
Tìm thấy khớp

Giải thích: Với transparent bounds, lookahead (?=\\w{6,10}\\z) có thể "nhìn" ra ngoài region (0-4) để kiểm tra độ dài toàn chuỗi.