রেগুলার এক্সপ্রেশন তৈরি করার সময় যদি আপনি যেকোনো প্যাটার্নের ঘটনার সংখ্যা নির্দিষ্ট করতে চান, তবে কোয়ান্টিফায়ার (quantifier) ব্যবহার করতে পারেন। জাভা তিন ধরনের কোয়ান্টিফায়ার সাপোর্ট করে: Greedy (লোভী), Reluctant (অনিচ্ছাকৃত) এবং Possessive (অধিকারী) কোয়ান্টিফায়ার।
Greedy Quantifiers (লোভী কোয়ান্টিফায়ার)
Greedy কোয়ান্টিফায়ার ডিফল্ট কোয়ান্টিফায়ার। এটি ইনপুট স্ট্রিং থেকে যতটুকু সম্ভব সবচেয়ে বড় ম্যাচ খুঁজে বের করে (longest match possible)। যদি ম্যাচ না হয়, তবে এটি শেষ ক্যারেক্টারটি ছেড়ে দিয়ে আবার ম্যাচ করার চেষ্টা করে।
উদাহরণ
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[0-9]+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
System.out.println("Matched text: ");
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
আউটপুট
Enter input text: 45545 Matched text: 45545
Reluctant Quantifiers (অনিচ্ছাকৃত কোয়ান্টিফায়ার)
Reluctant বা non-greedy কোয়ান্টিফায়ার যতটুকু সম্ভব কম ম্যাচ করে। প্রাথমিকভাবে এটি প্রথম ক্যারেক্টার ম্যাচ করে; যদি ম্যাচ না হয়, তবে ইনপুট স্ট্রিং থেকে আরেকটি ক্যারেক্টার যোগ করে আবার ম্যাচ করার চেষ্টা করে। Greedy কোয়ান্টিফায়ারের পরে ? চিহ্ন দিয়ে এটি reluctant বানানো যায়।
উদাহরণ
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[0-9]+?";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
আউটপুট
Enter input text: 12345678 1 2 3 4 5 6 7 8
Possessive Quantifiers (অধিকারী কোয়ান্টিফায়ার)
Possessive কোয়ান্টিফায়ার greedy কোয়ান্টিফায়ারের মতোই কিন্তু একটু পার্থক্য আছে: এটি প্রাথমিকভাবে যতটুকু সম্ভব বেশি ক্যারেক্টার ম্যাচ করার চেষ্টা করে, এবং যদি ম্যাচ না হয়, তবে greedy কোয়ান্টিফায়ারের মতো backtrack করে না। Greedy কোয়ান্টিফায়ারের পরে + চিহ্ন দিয়ে এটি possessive বানানো যায়।
Possessive কোয়ান্টিফায়ারদের তালিকা:
X?+- X, একবার বা শূন্য বার (possessive)X*+- X, শূন্য বা অধিক বার (possessive)X++- X, এক বা অধিক বার (possessive)X{n}+- X, ঠিক n বার (possessive)X{n,}+- X, কমপক্ষে n বার (possessive)X{n,m}+- X, কমপক্ষে n বার কিন্তু সর্বোচ্চ m বার (possessive)
উদাহরণ
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
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();
}
}
}
আউটপুট
Enter input text: 45678 45678