Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Possessive Quantifiers ใน Java Regex

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
GreedyX*จับคู่มากที่สุดใช่
ReluctantX*?จับคู่น้อยที่สุดใช่ (ขยาย)
PossessiveX*+จับคู่มากที่สุดไม่

เมื่อไหร่ใช้ Possessive?

  • ป้องกัน catastrophic backtracking
  • เพิ่มประสิทธิภาพเมื่อรู้ว่าต้องจับคู่มากที่สุด
  • ตัวอย่าง: .*+ แทน .* เมื่อไม่ต้องการ backtrack

ข้อจำกัด

Possessive อาจทำให้จับคู่ไม่ได้ในบางกรณีที่ greedy จับคู่ได้ (เพราะไม่ backtrack) ใช้ด้วยความระมัดระวัง