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

জাভা রেগুলার এক্সপ্রেশন: নন-ক্যাপচারিং গ্রুপ (Non-Capturing Groups)


ক্যাপচারিং গ্রুপ রিভিউ

ক্যাপচারিং গ্রুপ: প্যাটার্নের অংশকে প্যারেনথেসিস `(...)` দিয়ে গ্রুপ করলে সেটি "ক্যাপচার" হয় — بعدে `matcher.group(1)`, `group(2)` দিয়ে অ্যাক্সেস করা যায়। গ্রুপ ০ = পুরো ম্যাচ।

উদাহরণ: ক্যাপচারিং গ্রুপ

String regex = "(.*)(\\d+)(.*)"; // ৩টি ক্যাপচারিং গ্রুপ
// ইনপুট: "sample data with 1234 (digits) in middle"
// গ্রুপ ০: পুরো স্ট্রিং
// গ্রুপ ১: "sample data with 123"
// গ্রুপ ২: "4"
// গ্রুপ ৩: " (digits) in middle"

নন-ক্যাপচারিং গ্রুপ কী?

নন-ক্যাপচারিং গ্রুপ একই গ্রুপিং ফাংশনালিটি দেয় কিন্তু রেজাল্ট ক্যাপচার করে না। সিনট্যাক্স: (?:...)। এটি গ্রুপ কাউন্টে যোগ হয় না।

কোড উদাহরণ: নন-ক্যাপচারিং গ্রুপ

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NonCapturingGroupExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("ইনপুট টেক্সট লিখুন: ");
        String input = sc.nextLine();
        
        // মাঝের ডিজিট গ্রুপ নন-ক্যাপচারিং: (?:\\d+)
        String regex = "(.*)(?:\\d+)(.*)";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        
        if (matcher.find()) {
            System.out.println("গ্রুপ ০ (পুরো ম্যাচ): " + matcher.group(0));
            System.out.println("গ্রুপ ১: " + matcher.group(1));
            System.out.println("গ্রুপ ২: " + matcher.group(2));
            // matcher.group(3) -> IndexOutOfBoundsException! শুধু ২টি গ্রুপ।
            System.out.println("গ্রুপ কাউন্ট: " + matcher.groupCount()); // আউটপুট: ২
        } else {
            System.out.println("NO MATCH");
        }
    }
}

আউটপুট উদাহরণ

ইনপুট টেক্সট লিখুন: sample data with 1234 (digits) in middle
গ্রুপ ০ (পুরো ম্যাচ): sample data with 1234 (digits) in middle
গ্রুপ ১: sample data with 123
গ্রুপ ২: (digits) in middle
গ্রুপ কাউন্ট: 2

তুলনা: ক্যাপচারিং vs নন-ক্যাপচারিং

বিষয়ক্যাপচারিং ( ... )নন-ক্যাপচারিং ( ?: ... )
সিনট্যাক্স(pattern)(?:pattern)
রেজাল্ট ক্যাপচারহ্যাঁনা
groupCount() এ যোগহ্যাঁনা
group(n) দিয়ে অ্যাক্সেসহ্যাঁনা (Exception)
পারফরম্যান্সকিছুটা স্লোওয়ারফাস্টার (ক্যাপচারিং ওভারহেড নেই)
ব্যাকরেফারেন্স (\1, \2)কাজ করেকাজ করে না

কখন নন-ক্যাপচারিং গ্রুপ ব্যবহার করবেন?

  • গ্রুপিং শুধু অপারেটর প্রায়োরিটি বা অল্টারনেশন (`|`) এর জন্য দরকার হলে।
  • রেজাল্ট ক্যাপচার করার প্রয়োজন নেই।
  • পারফরম্যান্সкриটিক্যাল কোডে।
  • URL/ফোন নম্বর ম্যাচিংয়ে কমন প্রিফিক্স গ্রুপ করতে (যেমন `(?:http|https)://`)।

সারসংক্ষেপ

নন-ক্যাপচারিং গ্রুপ `(?:...)` রেজেক্সকে দ্রুত এবং কম মেমরি-খরচে করে। গ্রুপ কাউন্ট কম রাখে, যা বড় রেজেক্সে গ্রুপ নম্বর ম্যানেজ করতে সাহায্য করে। ক্যাপচারিং প্রয়োজন নেই কোথাও সেখানে এটি ব্যবহার করুন।

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

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

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

  4. জাভাতে রেগুলার এক্সপ্রেশন ব্যবহার করে স্ট্রিং থেকে নম্বর বের করা