Khái niệm
Possessive quantifier tương tự greedy nhưng không backtrack. Thêm + sau quantifier.
Danh sách
| Quantifier | Mô 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
| Input | Greedy \d++ | Possessive \d++ | Reluctant \d+? |
|---|---|---|---|
| 12345 | 1 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+