Greedy Quantifiers** (ค่าเริ่มต้น) จับคู่มากที่สุด ถ้าล้มเหลวจะ backtrack
Possessive Quantifiers** คล้าย greedy แต่ ไม่ backtrack** เลย จับคู่มากที่สุดครั้งเดียว ถ้าล้มเหลวก็ fail ทันที
เพิ่ม + หลัง greedy quantifier จะกลายเป็น possessive:
| Quantifier | ความหมาย |
|---|---|
re*+ | 0 หรือมากกว่า (possessive) |
re?+ | 0 หรือ 1 (possessive) |
re++ | 1 หรือมากกว่า (possessive) |
re{n}+ | n ครั้งพอดี (possessive) |
re{n,m}+ | n ถึง m ครั้ง (possessive) |
ตัวอย่าง: [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("Enter input text: ");
String input = sc.nextLine();
String regex = "[0-9]++";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.print(matcher.group());
System.out.println();
}
}
}
ผลลัพธ์
Enter input text: 45678
45678
อธิบาย
[0-9]++= possessive: จับคู่ตัวเลข 1+ หลัก ไม่ backtrack- Input "45678" → จับคู่ทั้งหมด "45678" ครั้งเดียว
- เหมือน greedy
[0-9]+แต่ไม่ย้อนกลับ
เปรียบเทียบ 3 โหมด
| โหมด | Syntax | พฤติกรรม | Backtrack |
|---|---|---|---|
| Greedy | X* | จับคู่มากที่สุด | ใช่ |
| Reluctant | X*? | จับคู่น้อยที่สุด | ใช่ (ขยาย) |
| Possessive | X*+ | จับคู่มากที่สุด | ไม่ |
เมื่อไหร่ใช้ Possessive?
- ป้องกัน catastrophic backtracking
- เพิ่มประสิทธิภาพเมื่อรู้ว่าต้องจับคู่มากที่สุด
- ตัวอย่าง:
.*+แทน.*เมื่อไม่ต้องการ backtrack
ข้อจำกัด
Possessive อาจทำให้จับคู่ไม่ได้ในบางกรณีที่ greedy จับคู่ได้ (เพราะไม่ backtrack) ใช้ด้วยความระมัดระวัง