পজেসিভ কোয়ান্টিফায়ার কী?
গ্রিডি কোয়ান্টিফায়ার সর্বোচ্চ ম্যাচ করে, না পারলে ব্যাকট্র্যাক করে। পজেসিভ কোয়ান্টিফায়ারও সর্বোচ্চ ম্যাচ করে কিন্তু ব্যাকট্র্যাক করে না। গ্রিডি কোয়ান্টিফায়ারের পরে `+` দিয়ে পজেসিভ বানানো হয়।
পজেসিভ কোয়ান্টিফায়ার তালিকা
| কোয়ান্টিফায়ার | ব্যাখ্যা |
|---|---|
| re*+ | শূন্য বা অধিক, পজেসিভ |
| re?+ | শূন্য বা এক, পজেসিভ |
| re++ | এক বা অধিক, পজেসিভ |
| re{n}+ | ঠিক n বার, পজেসিভ |
| re{n,m}+ | n থেকে m বার, পজেসিভ |
কোড উদাহরণ: পজেসিভ ডিজিট ম্যাচিং
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PossessiveQuantifierExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("ইনপুট টেক্সট লিখুন: ");
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();
}
}
}
আউটপুট উদাহরণ
ইনপুট টেক্সট লিখুন: 45678
45678
গ্রিডি vs পজেসিভ: ব্যাকট্র্যাকিং পার্থক্য
// ইনপুট: "12345"
// রেজেক্স: ".*\\d" (গ্রিডি) vs ".*+\\d" (পজেসিভ)
// গ্রিডি ".*" প্রথমে পুরো স্ট্রিং নেয়, তারপর ব্যাকট্র্যাক করে \d ম্যাচ করতে চায় -> সফল
// পজেসিভ ".*+" পুরো স্ট্রিং নেয়, ব্যাকট্র্যাক করে না -> \d ম্যাচ করতে পারেনা -> ফেল!
কখন পজেসিভ ব্যবহার করবেন?
- ক্যাটাস্ট্রোফিক ব্যাকট্র্যাকিং রোধে: নেস্টেড কোয়ান্টিফায়ার वाले রেজেক্সে (যেমন `
(a+)+`)। - পারফরম্যান্স: যখন আপনি নিশ্চিত যে একবার ম্যাচ হলে সেটি ফাইনাল।
- এটোমিক গ্রুপ অল্টারনেটিভ: `(?>...)` এটোমিক গ্রুপও একই কাজ করে, পজেসিভ কোয়ান্টিফায়ার সিনট্যাক্স সহজ।
সাবধানতা
- পজেসিভ কোয়ান্টিফায়ার সব রেগেক্স ফ্লেভার সাপোর্ট করে না (জাভা, PCRE, Oniguruma সাপোর্ট করে)।
- ভুল ব্যবহার করলে ম্যাচ মিস হতে পারে (উপরের `.*+\d` উদাহরণ)।
সারসংক্ষেপ
পজেসিভ কোয়ান্টিফায়ার (`++`, `*+`, `?+`, `{n}+`) গ্রিডির মত সর্বোচ্চ ম্যাচ করে কিন্তু ব্যাকট্র্যাকিং বন্ধ করে দেয়। এটি রেজেক্স ডিনায়াল অফ সার্ভিস (ReDoS) আটাক রোধে এবং পারফরম্যান্স অপ্টিমাইজেশনে খুব কার্যকর। সাবধানভাবে ব্যবহার করুন — একবার কমিট হলে ফিরে আসা যায় না।