কম্পিউটার টিউটোরিয়াল

জাভা রেগুলার এক্সপ্রেশন: পজেসিভ কোয়ান্টিফায়ার (Possessive Quantifiers)


পজেসিভ কোয়ান্টিফায়ার কী?

গ্রিডি কোয়ান্টিফায়ার সর্বোচ্চ ম্যাচ করে, না পারলে ব্যাকট্র্যাক করে। পজেসিভ কোয়ান্টিফায়ারও সর্বোচ্চ ম্যাচ করে কিন্তু ব্যাকট্র্যাক করে না। গ্রিডি কোয়ান্টিফায়ারের পরে `+` দিয়ে পজেসিভ বানানো হয়।

পজেসিভ কোয়ান্টিফায়ার তালিকা

কোয়ান্টিফায়ারব্যাখ্যা
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) আটাক রোধে এবং পারফরম্যান্স অপ্টিমাইজেশনে খুব কার্যকর। সাবধানভাবে ব্যবহার করুন — একবার কমিট হলে ফিরে আসা যায় না।

  1. জাভায় রেগুলার এক্সপ্রেশন ব্যবহার করে স্ট্রিং থেকে ব্যঞ্জনবর্ণ (Consonants) সরানো

  2. জাভা রেগুলার এক্সপ্রেশনে (?> re) সাব-এক্সপ্রেশন ব্যাখ্যা

  3. জাভা রেগুলার এক্সপ্রেশনে (?: re) সাব-এক্সপ্রেশন ব্যাখ্যা

  4. জাভা রেগুলার এক্সপ্রেশনে \B মেটাক্যারেক্টার ব্যাখ্যা