Java Regular Expressions (Regex)-এ Quantifiers একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, যেগুলি প্যাটার্নের মধ্যে একটি ক্যারেক্টারের সংখ্যা নিয়ন্ত্রণ করতে ব্যবহৃত হয়। Quantifiers নির্দিষ্ট করে কতবার একটি নির্দিষ্ট ক্যারেক্টার বা সাব-প্যাটার্ন মেলাতে হবে। Java Regex-এর Pattern এবং Matcher ক্লাসের মাধ্যমে এগুলি ব্যবহৃত হয়, যেগুলি রেগুলার এক্সপ্রেশন ব্যবহারে ব্যাপকভাবে সহায়ক।
Quantifiers in Java Regex
Quantifiers-গুলি রেগুলার এক্সপ্রেশনের গুরুত্বপূর্ণ অংশ, যা স্ট্রিংয়ের মধ্যে সুনির্দিষ্ট প্যাটার্নের মেলানো সংখ্যার সীমা নির্ধারণ করে। Java Regex-এর মধ্যে কিছু সাধারণ Quantifiers হল:
*(Zero or more)- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি শূন্য বা একাধিক বার আসতে পারে।
- Example:
a*— এখানেaশূন্য বা একাধিক বার আসতে পারে।
+(One or more)- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি এক বা একাধিক বার আসতে হবে।
- Example:
a+— এখানেaএক বা একাধিক বার আসতে হবে।
?(Zero or one)- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি শূন্য বা এক বার আসতে হবে।
- Example:
a?— এখানেaশূন্য বা একবার আসতে পারে।
{n}(Exact number of occurrences)- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি ঠিক
nবার আসতে হবে। - Example:
a{3}— এখানেaঠিক ৩ বার আসতে হবে (যেমন "aaa")।
- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি ঠিক
{n,}(At least n occurrences)- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি অন্তত
nবার আসতে হবে। - Example:
a{2,}— এখানেaকমপক্ষে ২ বার আসতে হবে (যেমন "aa", "aaa", "aaaa" ইত্যাদি)।
- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি অন্তত
{n,m}(Between n and m occurrences)- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি
nথেকেmবার আসতে পারে। - Example:
a{2,4}— এখানেa২ থেকে ৪ বার আসতে হবে (যেমন "aa", "aaa", "aaaa")।
- এটি বলে যে, আগের ক্যারেক্টার বা সাব-প্যাটার্নটি
Quantifiers: Practical Examples in Java
এখন আমরা Quantifiers এর কিছু ব্যবহারিক উদাহরণ দেখব। এসব উদাহরণ Java Pattern এবং Matcher ক্লাসের মাধ্যমে বাস্তবায়িত করা হবে।
1. Zero or More Quantifier (*):
import java.util.regex.*;
public class QuantifierExample {
public static void main(String[] args) {
String input = "aaa aa a";
// Patter for zero or more 'a' characters
Pattern pattern = Pattern.compile("a*");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
Output:
Found match: aaa
Found match:
Found match: aa
Found match:
Found match: a
ব্যাখ্যা:
a*: এখানে এটি বলছে যেaশূন্য বা একাধিক বার উপস্থিত হতে পারে, তাই এটি খালি স্ট্রিংও ম্যাচ করে, এবং একাধিক "a" সিকোয়েন্সও ম্যাচ করে।
2. One or More Quantifier (+):
import java.util.regex.*;
public class QuantifierExample {
public static void main(String[] args) {
String input = "aaa aa a";
// Pattern for one or more 'a' characters
Pattern pattern = Pattern.compile("a+");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
Output:
Found match: aaa
Found match: aa
Found match: a
ব্যাখ্যা:
a+: এটি বলছে যেaএক বা একাধিক বার থাকতে হবে, তাই এটি শুধু সেই অংশগুলি ম্যাচ করবে যেখানে কমপক্ষে একটিaরয়েছে।
3. Exact Number of Occurrences ({n}):
import java.util.regex.*;
public class QuantifierExample {
public static void main(String[] args) {
String input = "aaaa aaa aa a";
// Pattern for exactly 3 'a' characters
Pattern pattern = Pattern.compile("a{3}");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
Output:
Found match: aaa
ব্যাখ্যা:
a{3}: এটি বলছে যেaঅবশ্যই ৩ বার আসতে হবে, তাই শুধুমাত্র "aaa" অংশটি ম্যাচ হবে।
4. Between n and m Occurrences ({n,m}):
import java.util.regex.*;
public class QuantifierExample {
public static void main(String[] args) {
String input = "aaaa aaa aa a";
// Pattern for between 2 and 4 'a' characters
Pattern pattern = Pattern.compile("a{2,4}");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Found match: " + matcher.group());
}
}
}
Output:
Found match: aaaa
Found match: aaa
Found match: aa
ব্যাখ্যা:
a{2,4}: এটি বলছে যেa২ থেকে ৪ বার থাকতে হবে, তাই "aaaa", "aaa", এবং "aa" অংশগুলি ম্যাচ করবে।
Performance Impact of Quantifiers:
Quantifiers ব্যবহারের সাথে performance সম্পর্কিত কিছু বিষয় থাকতে পারে, বিশেষত greedy quantifiers (*, +) এর ক্ষেত্রে। এগুলি স্ট্রিংয়ের সমস্ত অংশ স্ক্যান করতে পারে, যার ফলে পারফরম্যান্সের উপর প্রভাব পড়তে পারে। নিচে কিছু বিষয় আলোচনা করা হলো:
- Greedy vs Lazy Matching:
- Greedy quantifiers যেমন
*এবং+, যতটা সম্ভব বেশি ম্যাচ করার চেষ্টা করে। এটি বৃহৎ ইনপুট স্ট্রিংয়ের জন্য পারফরম্যান্সে প্রভাব ফেলতে পারে। উদাহরণস্বরূপ, একটি স্ট্রিংয়ে কয়েক হাজারaএবংbএর সংমিশ্রণ থাকলেa*প্যাটার্ন একটি বড় অংশ ম্যাচ করতে পারে।
- Greedy quantifiers যেমন
- Backtracking:
- যদি একটি প্যাটার্ন খুবই কম্প্লেক্স হয় বা অনেক সম্ভাব্য ম্যাচ থাকে, তখন regex একাধিক ব্যাকট্র্যাকিং করবে (অর্থাৎ, সম্ভাব্য অন্যান্য সমাধান চেক করবে)। এটি কার্যকরভাবে স্ট্রিংয়ের বিভিন্ন অংশ পরীক্ষা করে এবং এটা পারফরম্যান্সের জন্য খুবই খারাপ হতে পারে।
- Efficient Quantifier Usage:
- Lazy quantifiers যেমন
*?এবং+?(যেগুলি কম ম্যাচ করার চেষ্টা করে), ব্যাকট্র্যাকিং কম করে এবং সাধারণত ভালো পারফরম্যান্স দেয়। এটি বিশেষ করে ব্যবহার করা উচিত যখন স্ট্রিংয়ের অনেকাংশে মিল না থাকে।
- Lazy quantifiers যেমন
- Limited Matches:
{n,m}ব্যবহার করে আপনি মেলানোর সংখ্যা সীমিত করতে পারেন। এটি অযথা ব্যাকট্র্যাকিং কমাতে সাহায্য করবে এবং পারফরম্যান্সে উন্নতি আনতে পারে।
- Quantifiers (
*,+,{n,m}) Java Regex-এর অন্যতম গুরুত্বপূর্ণ অংশ, যা স্ট্রিংয়ের মধ্যে সুনির্দিষ্ট সংখ্যা পর্যন্ত মেলানো বা সীমাবদ্ধতা প্রয়োগ করতে ব্যবহৃত হয়। - Greedy quantifiers বড় ইনপুটের ক্ষেত্রে পারফরম্যান্সের উপর প্রভাব ফেলতে পারে, বিশেষ করে যখন স্ট্রিংয়ে অনেক মিল থাকে।
- Lazy quantifiers এবং limited matching টেকনিক ব্যবহার করলে পারফরম্যান্স উন্নত করা সম্ভব।
Read more