পজেসিভ কোয়ান্টিফায়ার [X?+] কী?
পজেসিভ কোয়ান্টিফায়ার `X?+` মানে: ক্যারেক্টার `X` একবার থাকতে পারে বা একদম নাও থাকতে পারে — কিন্তু ব্যাকট্র্যাকিং (backtracking) করে না। একবার ম্যাচ হলে সেটি ফিক্সড থাকে।
পজেসিভ vs গ্রিডি vs রিলাক্ট্যান্ট
| টাইপ | সিনট্যাক্স | আচরণ |
|---|---|---|
| গ্রিডি (ডিফল্ট) | X? | ম্যাচ করতে চায়, না পারলে ব্যাকট্র্যাক করে |
| রিলাক্ট্যান্ট (নন-গ্রিডি) | X?? | ন্যূনতম ম্যাচ করে, দরকারে বাড়ায় |
| পজেসিভ | X?+ | একবার ম্যাচ হলে ফিক্সড, ব্যাকট্র্যাক করে না |
কোড উদাহরণ: Pattern.matcher() দিয়ে স্টার্ট ইনডেক্স প্রিন্ট
package com.tutorialspoint;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PossessiveQuantifierDemo {
private static final String REGEX = "T?+";
private static final String INPUT = "abcdTatW";
public static void main(String[] args) {
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
while (matcher.find()) {
// ম্যাচের স্টার্ট ইনডেক্স প্রিন্ট
System.out.println("Match String start(): " + matcher.start());
}
}
}
আউটপুট
Match String start(): 0
Match String start(): 1
Match String start(): 2
Match String start(): 3
Match String start(): 4
Match String start(): 5
Match String start(): 6
Match String start(): 7
Match String start(): 8
ব্যাখ্যা
- রেজেক্স `T?+` মানে: 'T' শূন্য বা একবার, পজেসিভলি।
- ইনপুট "abcdTatW" (লেন্থ ৮, ইনডেক্স ০-৭) + শেষে এক্সট্রা পজিশন ৮।
- প্রতিটি পজিশনে 'T' না থাকায় শূন্য-দৈর্ঘ্যের ম্যাচ হয় (পজেসিভ কোয়ান্টিফায়ার শূন্য-দৈর্ঘ্য ম্যাচ আ্যালো করে)।
- ইনডেক্স ৪-এ 'T' আছে, সেখানে এক-দৈর্ঘ্যের ম্যাচ।
- মোট ৯টি ম্যাচ (০ থেকে ৮)।
পজেসিভ কোয়ান্টিফায়ার তালিকা
| কোয়ান্টিফায়ার | ব্যাখ্যা |
|---|---|
| re*+ | শূন্য বা অধিক, পজেসিভ |
| re?+ | শূন্য বা এক, পজেসিভ |
| re++ | এক বা অধিক, পজেসিভ |
| re{n}+ | ঠিক n বার, পজেসিভ |
| re{n,m}+ | n থেকে m বার, পজেসিভ |
কখন পজেসিভ কোয়ান্টিফায়ার ব্যবহার করবেন?
- ব্যাকট্র্যাকিং-জনিত পারফরম্যান্স সমস্যা (catastrophic backtracking) এড়াতে।
- যখন আপনি নিশ্চিত যে একবার ম্যাচ হলে সেটি ফাইনাল।
- এক্সপেনসিভ রেজেক্স প্যাটার্নে (নেস্টেড কোয়ান্টিফায়ার সহ) পজেসিভ কোয়ান্টিফায়ার ডেডলক এড়াতে সাহায্য করে।
সারসংক্ষেপ
`X?+` পজেসিভ কোয়ান্টিফায়ার 'X'-কে অপশনাল করে দেয় কিন্তু একবার ম্যাচ হলে সেটি রিলিজ করে না। এটি ব্যাকট্র্যাকিং রোধ করে এবং কিছু কেসে রেজেক্স পারফরম্যান্স ড্রামাটিকলি বেড়াতে পারে। জাভা রেগেক্স ইঞ্জিন পজেসিভ কোয়ান্টিফায়ার ফুল সাপোর্ট করে।