Unicode Normalization এবং Matching Techniques Java রেগুলার এক্সপ্রেশন (regex) এবং স্ট্রিং ম্যানিপুলেশনের জন্য গুরুত্বপূর্ণ ধারণা। এগুলি মূলত স্ট্রিংগুলোর মধ্যে বিভিন্ন ধরণের ক্যারেক্টার ম্যাচিং এবং স্ট্যান্ডার্ডাইজেশন (normalization) নিশ্চিত করার জন্য ব্যবহৃত হয়।
১. Unicode Normalization:
Unicode Normalization হল একটি প্রক্রিয়া যা Unicode স্ট্রিংয়ের মধ্যে বিভিন্ন ধরনের কনট্রাক্টেড বা ডি-কনট্রাক্টেড ক্যারেক্টারদের একক ফর্মে নিয়ে আসে, যাতে স্ট্রিংগুলো সমানভাবে হ্যান্ডেল করা যায়। Unicode একটি বিস্তৃত চরিত্র সেট, যা বিশ্বের বিভিন্ন ভাষার ক্যারেক্টার সমর্থন করে। তবে কিছু ক্যারেক্টার একাধিক উপায়ে রেকর্ড করা হতে পারে, যা সমস্যা তৈরি করতে পারে যখন স্ট্রিং তুলনা বা ম্যাচিং করা হয়।
Unicode Normalization প্রক্রিয়ায় সাধারণত তিনটি ফর্ম ব্যবহৃত হয়:
- NFD (Normalization Form Decomposed): কম্পোজড ক্যারেক্টারের (যেমন: আক্ষরিকভাবে একটি কম্বিনড ক্যারেক্টার) ভেঙে আলাদা করা।
- NFC (Normalization Form Composed): ভেঙে ফেলা ক্যারেক্টারগুলো পুনরায় একত্রিত করা।
- NFKD (Normalization Form Compatibility Decomposed): ক্যারেক্টারগুলির কম্প্যাটিবিলিটি সংস্করণে ভেঙে ফেলা।
- NFKC (Normalization Form Compatibility Composed): কম্প্যাটিবিলিটি ফর্মে ক্যারেক্টারগুলিকে একত্রিত করা।
Java-তে java.text.Normalizer ক্লাসটি Unicode স্ট্রিংয়ের normalization করার জন্য ব্যবহৃত হয়।
Unicode Normalization উদাহরণ:
import java.text.Normalizer;
public class UnicodeNormalizationExample {
public static void main(String[] args) {
// Example of Unicode normalization
String original = "\u00E1"; // 'á' as a single character
String decomposed = "\u0061\u0301"; // 'a' + combining acute accent
// Normalize to NFC (Composed Form)
String normalized = Normalizer.normalize(decomposed, Normalizer.Form.NFC);
System.out.println("Original: " + original);
System.out.println("Decomposed: " + decomposed);
System.out.println("Normalized: " + normalized);
// Check if normalized form matches
System.out.println("Matches: " + original.equals(normalized)); // true
}
}
Output:
Original: á
Decomposed: á
Normalized: á
Matches: true
ব্যাখ্যা:
Normalizer.normalize()মেথডটি স্ট্রিংটিকে নির্দিষ্ট normalization ফর্মে রূপান্তরিত করে।- এখানে
á(single character) এবংa+ combining acute accent (decomposed form) একটি নতুন স্ট্রিংয়ে সমান হয়ে গেছে যখন normalization করা হয়েছে।
২. Matching Techniques in Java:
Java-তে স্ট্রিংয়ের সাথে মিলানো বা রেগুলার এক্সপ্রেশন ম্যাচিং করতে বেশ কয়েকটি টেকনিক রয়েছে। এগুলি সাধারণত Pattern এবং Matcher ক্লাসের মাধ্যমে করা হয়।
1. Pattern Matching:
Java-তে স্ট্রিংয়ের সাথে রেগুলার এক্সপ্রেশন মিলানোর জন্য প্রথমে একটি Pattern অবজেক্ট তৈরি করতে হয়। তারপর সেই প্যাটার্নের সাথে স্ট্রিং মিলাতে Matcher ক্লাস ব্যবহার করা হয়।
Basic Matching Techniques:
- Exact Matching: স্ট্রিংটি প্যাটার্নের সাথে পুরোপুরি মেলে কিনা তা পরীক্ষা করা।
- Partial Matching: স্ট্রিংটি প্যাটার্নের একটি অংশের সাথে মেলে কিনা তা পরীক্ষা করা।
- Matching with Flags: প্যাটার্নে ফ্ল্যাগ ব্যবহার করা (যেমন
CASE_INSENSITIVE)। - Find Multiple Matches: স্ট্রিংয়ে একাধিক প্যাটার্ন খুঁজে বের করা।
Example: Basic Matching Techniques
import java.util.regex.*;
public class MatchingTechniquesExample {
public static void main(String[] args) {
String input = "Hello, this is a sample text for regex matching.";
// Compile the pattern
Pattern pattern = Pattern.compile("\\b[a-zA-Z]+\\b"); // Matching words
// Create matcher
Matcher matcher = pattern.matcher(input);
// Find all matches
while (matcher.find()) {
System.out.println("Found word: " + matcher.group());
}
}
}
Output:
Found word: Hello
Found word: this
Found word: is
Found word: a
Found word: sample
Found word: text
Found word: for
Found word: regex
Found word: matching
ব্যাখ্যা:
\b[a-zA-Z]+\b: প্যাটার্নটি শুধুমাত্র শব্দের জন্য মিলবে।\bশব্দের সীমানা চিহ্নিত করে।matcher.find(): এটি স্ট্রিংয়ের মধ্যে প্যাটার্নের প্রথম ম্যাচ খুঁজে বের করে এবং পরবর্তী ম্যাচটি খুঁজতেfind()মেথডটি আবার কল করা হয়।
Example: Matching with Flags
import java.util.regex.*;
public class MatchingWithFlagsExample {
public static void main(String[] args) {
String text = "Hello World! hello world!";
// Compile pattern with case insensitive flag
Pattern pattern = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
// Create matcher
Matcher matcher = pattern.matcher(text);
// Find all matches
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
}
}
Output:
Found: Hello
Found: hello
ব্যাখ্যা:
Pattern.CASE_INSENSITIVEফ্ল্যাগটি প্যাটার্ন ম্যাচিংকে case-insensitive করে তোলে।- এখানে
"Hello"এবং"hello"দুটি ম্যাচ হয় কারণ প্যাটার্নটি কেস ইনসেন্সিটিভ।
Advanced Matching Techniques:
- Lookahead and Lookbehind: স্ট্রিংয়ে একটি প্যাটার্নের উপস্থিতি বা অনুপস্থিতি চেক করার জন্য positive এবং negative lookahead ও lookbehind ব্যবহার করা হয়।
- Word Boundaries (
\band\B): শব্দের সীমানা চিহ্নিত করতে ব্যবহার করা হয়।\bশব্দের শুরু বা শেষ চিহ্নিত করে, আর\Bশব্দের বাইরে চিহ্নিত করে। - Greedy vs. Reluctant Quantifiers: গ্রীডি কুয়ান্টিফায়ার যেমন
*বা+যতটা সম্ভব বেশি মিলাতে চেষ্টা করে, তবে reluctant কুয়ান্টিফায়ার যেমন*?বা+?কম চরিত্র মিলানোর চেষ্টা করে।
Summary:
- Unicode Normalization Java-তে স্ট্রিংয়ের ইউনিকোড সংস্করণের স্ট্যান্ডার্ডাইজেশন নিশ্চিত করে, যা স্ট্রিংয়ের তুলনা ও ম্যাচিংয়ের ক্ষেত্রে একরকমের অস্থিরতা কমায়।
- Pattern Matching Java-তে স্ট্রিংয়ের সাথে রেগুলার এক্সপ্রেশন প্যাটার্ন মিলানোর জন্য ব্যবহৃত হয়।
PatternএবংMatcherক্লাসগুলি স্ট্রিংয়ের মধ্যে প্যাটার্ন খোঁজার এবং মেলানোর জন্য ব্যবহৃত হয়।
Read more