Recursive Patterns এবং Balanced Parentheses Matching

Complex Pattern Matching Techniques - জাভা রেজেক্স (Java Regex) - Java Technologies

356

Java Reflection প্যাকেজের মাধ্যমে কোডের স্ট্রাকচার সম্পর্কিত তথ্য পাওয়া সম্ভব, তবে Recursive Patterns এবং Balanced Parentheses Matching বিষয়গুলি মূলত Regex (Regular Expressions) এর ক্ষেত্রের মধ্যে পড়ে। আমরা এখানে Recursive Patterns এবং Balanced Parentheses Matching এর উদাহরণ সহ আলোচনা করবো, এবং দেখব কিভাবে এগুলি Java-তে Pattern এবং Matcher ক্লাস ব্যবহার করে কার্যকরী করা যায়।

১. Recursive Patterns in Regex

Recursive Patterns সাধারণত সেই প্যাটার্নগুলির জন্য ব্যবহৃত হয় যেখানে একটি প্যাটার্ন নিজেই অন্য প্যাটার্নে পুনরাবৃত্তি হয়। এটা স্ট্রাকচারাল প্যাটার্ন যেমন ব্র্যাকেট বা কোষ (parentheses) ম্যাচিংয়ের ক্ষেত্রে বিশেষভাবে ব্যবহার হয়। Java-এর Pattern এবং Matcher ক্লাসে সাধারণত রেগুলার এক্সপ্রেশন এর মাধ্যমে একে বাস্তবায়ন করা কঠিন, কারণ Java এর পুরনো রেগুলার এক্সপ্রেশন ইঞ্জিন recursive বা back-reference প্যাটার্ন সমর্থন করে না। তবে, কিছু পরিস্থিতিতে, যেখানে নির্দিষ্ট প্যাটার্নের মধ্যে পুনরাবৃত্তি হয়, আপনি কিছু নির্দিষ্ট টেকনিক ব্যবহার করতে পারেন।

২. Balanced Parentheses Matching

Balanced Parentheses Matching এমন একটি সমস্যা যেখানে আপনি স্ট্রিংয়ের মধ্যে যেকোনো ধরনের প্যারেন্টেসিস যেমন (), {}, [] দেখতে চান এবং চেক করতে চান যে সেগুলি সঠিকভাবে মিলেছে কিনা, অর্থাৎ, প্রতিটি খোলার প্যারেন্টেসিস একটি বন্ধ প্যারেন্টেসিসের দ্বারা সঠিকভাবে বন্ধ করা হয়েছে।

এটি একটি Recursive Pattern বা স্ট্যাকের মাধ্যমে সমাধান করা যেতে পারে, কিন্তু রেগুলার এক্সপ্রেশনও এই ধরনের টাস্কে কিছু সীমাবদ্ধতা নিয়ে কাজ করে।

উদাহরণ 1: Balanced Parentheses Matching in Java with Regex

আমরা এখানে একটি সাধারণ প্যাটার্ন দিয়ে Balanced Parentheses Matching দেখব, যেখানে শুধুমাত্র সাধারণ () সিম্বল ব্যবহার করা হয়েছে।

import java.util.regex.*;

public class BalancedParentheses {
    public static void main(String[] args) {
        String text = "((a + b) * (c - d))";
        
        // Regular expression to match balanced parentheses
        Pattern pattern = Pattern.compile("^([^()]*\\(([^()]*|(?1))*\\)[^()]*|[^()]*$)+$");

        Matcher matcher = pattern.matcher(text);
        
        if (matcher.matches()) {
            System.out.println("The parentheses are balanced.");
        } else {
            System.out.println("The parentheses are not balanced.");
        }
    }
}

ব্যাখ্যা:

  • ^([^()]*\\(([^()]*|(?1))*\\)[^()]*|[^()]*$)+$ প্যাটার্নটি:
    • \\( এবং \\): এটি খোলার এবং বন্ধ প্যারেন্টেসিসকে চিহ্নিত করতে ব্যবহৃত হয়।
    • ([^()]*|(?1)): এটি একটি রিকার্সিভ প্যাটার্ন, যেখানে ( ) এর মধ্যে আরেকটি প্যাটার্ন মেলে। (?1) দ্বারা এটি নিজেই একটি রিকার্সিভ মডিফায়ার হিসেবে কাজ করছে।
    • এটি শুধুমাত্র তখনই match করবে যখন প্যারেন্টেসিস সঠিকভাবে নেস্টেড এবং ব্যালেন্সড থাকবে।

উদাহরণ 2: Balanced Parentheses Matching with Stack (Better Approach)

Java-তে স্ট্যাক ব্যবহার করে Balanced Parentheses Matching আরও কার্যকরী এবং সহজ হতে পারে। এটি একটি স্ট্রাকচারাল সমাধান, যা রেগুলার এক্সপ্রেশন দিয়ে সহজে করা সম্ভব নয়।

import java.util.Stack;

public class BalancedParenthesesWithStack {
    public static void main(String[] args) {
        String input = "((a + b) * (c - d))";
        
        if (isBalanced(input)) {
            System.out.println("The parentheses are balanced.");
        } else {
            System.out.println("The parentheses are not balanced.");
        }
    }

    public static boolean isBalanced(String input) {
        Stack<Character> stack = new Stack<>();
        
        // Traverse through each character in the input
        for (char ch : input.toCharArray()) {
            if (ch == '(') {
                stack.push(ch); // Push opening parenthesis onto the stack
            } else if (ch == ')') {
                if (stack.isEmpty()) {
                    return false; // If the stack is empty, it's not balanced
                }
                stack.pop(); // Pop the top element if a closing parenthesis is found
            }
        }

        // If stack is empty, parentheses are balanced
        return stack.isEmpty();
    }
}

Output:

The parentheses are balanced.

ব্যাখ্যা:

  • Stack ব্যবহার করে আমরা প্রতিটি ( (খোলার প্যারেন্টেসিস) কে স্ট্যাকে পুশ করি এবং প্রতিটি ) (বন্ধ প্যারেন্টেসিস) কে স্ট্যাক থেকে পপ করি।
  • যদি stack.isEmpty() থাকে, তাহলে প্যারেন্টেসিস সঠিকভাবে ব্যালেন্সড। অন্যথায়, যদি স্ট্যাক খালি না থাকে, তাহলে এটি ব্যালেন্সড নয়।

Java Regex with Recursive Patterns এবং Balanced Parentheses Matching:

  1. Regex Limitations:
    • Recursive patterns Java এর স্ট্যান্ডার্ড Pattern ইঞ্জিন সমর্থন করে না। তবে, কিছু নির্দিষ্ট প্রক্রিয়া যেমন back-references বা recursive sub-patterns ব্যবহার করে কিছু সীমিত ক্ষেত্রে প্রয়োগ করা যেতে পারে।
    • Java-তে সাধারণত Balanced Parentheses Matching এর মতো স্ট্রাকচারাল কাজের জন্য stack-based solutions বেশি কার্যকরী হয়।
  2. Balanced Parentheses Matching:
    • Regex দিয়ে সাধারণত প্যারেন্টেসিস ম্যাচিং করা যায়, কিন্তু এটি শুধু নির্দিষ্ট প্যাটার্নের মধ্যে সীমাবদ্ধ থাকে।
    • Stack-based পদ্ধতি একটি ভালো এবং সহজ সমাধান যা খোলার এবং বন্ধ প্যারেন্টেসিসের মধ্যে সঠিক সম্পর্ক ধরে রাখতে সহায়তা করে।
  • Regex-এর মাধ্যমে Recursive Patterns কিছু পরিস্থিতিতে ব্যবহার করা সম্ভব, তবে Java-তে স্ট্রাকচারাল সমস্যা যেমন Balanced Parentheses Matching এর জন্য স্ট্যাক ব্যবহার করা সবচেয়ে কার্যকর।
  • Java Reflection প্যাকেজ Pattern এবং Matcher ক্লাসের মাধ্যমে স্ট্রিং প্রক্রিয়াকরণে সহায়ক হলেও কিছু ক্ষেত্রে যেমন রিকার্সিভ বা স্ট্রাকচারাল ম্যাচিংয়ের জন্য অন্যান্য পদ্ধতি ব্যবহার করা উচিত।
Content added By
Promotion

Are you sure to start over?

Loading...