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

Possessive Quantifiers trong Java Regular Expressions


Khái niệm

Possessive quantifier tương tự greedy nhưng không backtrack. Thêm + sau quantifier.

Danh sách

QuantifierMô tả
re*+0 hoặc nhiều, không backtrack
re?+0 hoặc 1, không backtrack
re++1 hoặc nhiều, không backtrack
re{n}+Chính xác n, không backtrack
re{n,m}+Từ n đến m, không backtrack

Ví dụ: [0-9]++

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

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Nhập văn bản: ");
        String input = sc.nextLine();
        String regex = "[0-9]++";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}
Nhập văn bản: 45678
45678

So sánh 3 loại

InputGreedy \d++Possessive \d++Reluctant \d+?
123451 match: "12345"1 match: "12345"5 matches: "1","2","3","4","5"

Khác biệt chỉ hiện khi regex phần sau thất bại khiến greedy backtrack, possessive thì fail ngay.

Khi nào dùng Possessive?

  • Tối ưu hiệu năng: tránh backtrack không cần thiết
  • Khi chắc chắn pattern sau không thể khớp nếu quantifier ăn quá nhiều
  • Ví dụ: \d++\.\\d++ parse số thực nhanh hơn \d+\\.\\d+