Reluctant Quantifiers হল রেগুলার এক্সপ্রেশনে বিশেষ ধরনের কুয়ান্টিফায়ার, যা "লেজি" (lazy) ম্যাচিং কৌশল ব্যবহার করে। সাধারণত, কুয়ান্টিফায়ারগুলি "গ্রিপ" (greedy) হয়, অর্থাৎ তারা যতটা সম্ভব বেশি চরিত্র মিলাতে চায়। তবে, reluctant quantifiers কমপক্ষে একবার মেলে এবং যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করে। এগুলি lazy quantifiers হিসেবেও পরিচিত।
Reluctant Quantifiers:
*?: শূন্য বা একাধিক বার মিলাতে চেষ্টা করে, তবে যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করবে।+?: এক বা একাধিক বার মিলাতে চেষ্টা করে, তবে যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করবে।{n}?: ঠিকnবার মিলাতে চেষ্টা করে, তবে যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করবে।{n,m}?:nথেকেmবার মিলাতে চেষ্টা করে, তবে যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করবে।
এগুলি সাধারণ কুয়ান্টিফায়ারের (যেমন, *, +, {n}, {n,m}) একই ধরনের, তবে এগুলি lazy (অথবা reluctant) হয়, অর্থাৎ, তারা চরিত্র গুলি কম ম্যাচ করার চেষ্টা করে।
1. *? (Reluctant Quantifier for 0 or more matches):
এটি "শূন্য বা একাধিক" মিলের জন্য ব্যবহৃত হয়, তবে যতটা সম্ভব কম চরিত্র মিলাতে চেষ্টা করে।
উদাহরণ:
import java.util.regex.*;
public class ReluctantQuantifierExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("<.*?>");
Matcher matcher = pattern.matcher("<html>Text</html>");
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
}
}
Output:
Found: <html>
Found: </html>
ব্যাখ্যা:
<.*?>: এখানে*?যতটা সম্ভব কম চরিত্র মিলাতে চায়। এটি প্রথম<থেকে পরবর্তী>পর্যন্ত ছোট অংশ ম্যাচ করে এবং দ্বিতীয়<html>থেকে</html>পর্যন্ত ছোট অংশ ম্যাচ করে।.*?প্যাটার্নটি যতটা সম্ভব কম ম্যাচ করতে চেষ্টা করছে, তাই<html>এবং</html>দুটি আলাদা মেলানো অংশ হিসেবে বের হয়েছে।
2. +? (Reluctant Quantifier for 1 or more matches):
এটি "এক বা একাধিক" মিলের জন্য ব্যবহৃত হয়, তবে যতটা সম্ভব কম চরিত্র মিলাতে চেষ্টা করে।
উদাহরণ:
import java.util.regex.*;
public class ReluctantQuantifierExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("<.+?>");
Matcher matcher = pattern.matcher("<html>Text</html>");
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
}
}
Output:
Found: <html>
Found: </html>
ব্যাখ্যা:
<.+?>: এখানে+?এক বা একাধিক চরিত্র মেলে, তবে যতটা সম্ভব কম চরিত্র মিলানোর চেষ্টা করে। এটি<html>এবং</html>-এর মধ্যে থাকা ছোট অংশ মিলিয়ে দেখাবে।
3. {n}? (Reluctant Quantifier for exactly n matches):
এটি নির্দিষ্ট সংখ্যক বার মিলানোর জন্য ব্যবহৃত হয়, তবে যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করে।
উদাহরণ:
import java.util.regex.*;
public class ReluctantQuantifierExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\d{2}?");
Matcher matcher = pattern.matcher("12345");
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
}
}
Output:
Found: 12
Found: 34
Found: 45
ব্যাখ্যা:
\\d{2}?: এখানে{2}?দুটি ডিজিট মেলে, কিন্তু যতটা সম্ভব কম ডিজিট ম্যাচ করতে চায়। এটি প্রথমে12, তারপর34, এবং শেষে45ম্যাচ করছে।
4. {n,m}? (Reluctant Quantifier for between n and m matches):
এটি n থেকে m বার মিলানোর জন্য ব্যবহৃত হয়, তবে যতটা সম্ভব কম চরিত্র ম্যাচ করার চেষ্টা করে।
উদাহরণ:
import java.util.regex.*;
public class ReluctantQuantifierExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\d{2,4}?");
Matcher matcher = pattern.matcher("123456");
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
}
}
Output:
Found: 12
Found: 34
Found: 56
ব্যাখ্যা:
\\d{2,4}?: এখানে{2,4}?একটি সংখ্যা যেটি ২ থেকে ৪ বার মিলানোর চেষ্টা করে, তবে যতটা সম্ভব কম মিলাতে চায়। তাই এটি প্রথমে12, তারপর34, এবং শেষে56মেলে।
Reluctant Quantifiers এবং Greedy Quantifiers এর মধ্যে পার্থক্য:
- Greedy Quantifiers (যেমন
*,+,{n,m}) যতটা সম্ভব বেশি মিলানোর চেষ্টা করে। উদাহরণস্বরূপ,.*যতটা সম্ভব বেশি চরিত্র মেলাতে চায়। - Reluctant Quantifiers (যেমন
*?,+?,{n,m}?) যতটা সম্ভব কম মিলানোর চেষ্টা করে। তারা শুধুমাত্র প্রথম সীমানায় মেলে এবং পরবর্তী মিলানোর জন্য অপেক্ষা করে। - Reluctant Quantifiers রেগুলার এক্সপ্রেশন প্যাটার্নে গ্রিপি কুয়ান্টিফায়ারগুলির বিপরীতে কাজ করে, যা কম চরিত্র মিলানোর চেষ্টা করে। তারা বিশেষভাবে lazy matching করতে ব্যবহৃত হয়, যেখানে নির্দিষ্ট সীমানায় সবচেয়ে কম মিলানো হয়।
- এগুলি গুরুত্বপূর্ণ যখন আপনি স্ট্রিংয়ে নির্দিষ্ট অংশ খুঁজে পেতে চান, কিন্তু সেই অংশের মধ্যে অতিরিক্ত ক্যারেক্টার মিলানো থেকে এড়িয়ে যেতে চান।
Read more