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

জাভা রেগুলার এক্সপ্রেশন: একাধিক লাইন ম্যাচ করা (Multi-line Matching)


মাল্টি-লাইন ইনপুটে রেগেক্স ম্যাচিং

যদি ইনপুট টেক্সটে একাধিক লাইন থাকে এবং প্রতিটি লাইনে আলাদা আলাদা রেগেক্স ম্যাচ করতে হয়, তবে নিচের পদ্ধতিটি অনুসরণ করুন:

ধাপাবধি পদ্ধতি

  1. ইনপুট স্ট্রিং নিন।
  2. split("\r?\n") দিয়ে লাইনগুলো আলাদা করুন (Windows: \r\n, Unix: \n)।
  3. রেগেক্স প্যাটার্ন কম্পাইল করুন।
  4. ম্যাচার অবজেক্ট তৈরি করুন।
  5. লুপ দিয়ে প্রতিটি লাইনে find() করুন।
  6. প্রতিটি লাইনের জন্য matcher.reset(strArray[i]) কল করুন।

কোড উদাহরণ: প্রতিটি লাইনে ডিজিট খুঁজে বের করা

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

public class MultiLineMatching {
    public static void main(String[] args) {
        // মাল্টি-লাইন ইনপুট
        String input = "sample text line 1 \n line2 353 35 63 \n line 3 53 35";
        String regex = "\\d"; // ডিজিট ম্যাচ
        
        // লাইন-wise সплиট
        String[] strArray = input.split("\r?\n");
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input); // ইনিশিয়াল ইনপুট
        
        for (int i = 0; i < strArray.length; i++) {
            // প্রতিটি লাইনের জন্য ম্যাচার রিসেট
            matcher.reset(strArray[i]);
            System.out.println("Line:: " + (i+1));
            
            while (matcher.find()) {
                System.out.print(matcher.group() + " ");
            }
            System.out.println();
        }
    }
}

আউটপুট

Line:: 1 1
Line:: 2 2 3 5 3 3 5 6 3
Line:: 3 3 5 3 3 5

ব্যাখ্যা

  • লাইন ১: "sample text line 1" -> শুধু '1' পাওয়া গেল।
  • লাইন ২: "line2 353 35 63" -> 2, 3, 5, 3, 3, 5, 6, 3 = ৮টি ডিজিট।
  • লাইন ৩: "line 3 53 35" -> 3, 5, 3, 3, 5 = ৫টি ডিজিট।

বিকল্প: MULTILINE মোড (Pattern.MULTILINE)

যদি আপনি `^` এবং `$` অ্যাঙ্কর ব্যবহার করে লাইন শুরু/শেষ ম্যাচ করতে চান, তবে Pattern.compile(regex, Pattern.MULTILINE) ব্যবহার করুন। তবে উপরের পদ্ধতিটি আরও ফ্লেক্সিবল এবং প্রতিটি লাইন আলাদা প্রসেস করতে দেয়।

সারসংক্ষেপ

মাল্টি-লাইন টেক্সটে রেগেক্স ম্যাচ করার সবচেয়ে নিশ্চিত পদ্ধতি হলো লাইন অনুযায়ী সплиট করে প্রতিটি লাইন আলাদা প্রসেস করা। split("\r?\n") ক্রস-প্ল্যাটফর্ম কম্প্যাটিবল, এবং matcher.reset() দিয়ে প্রতিটি লাইনে নতুন matcher তৈরি করতে হয় না — একই matcher রিয়ूজ করা যায়।

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

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

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

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