Java Regular Expressions (Regex) java.util.regex প্যাকেজের মাধ্যমে টেক্সট ম্যানিপুলেশন এবং প্যাটার্ন মাচিং করতে ব্যবহৃত হয়। Java-তে রেগুলার এক্সপ্রেশন টেক্সটের বিভিন্ন দিক যেমন স্ট্রিং মাচিং, টেক্সট ভ্যালিডেশন, এবং ডেটা ম্যানিপুলেশন করার জন্য একটি শক্তিশালী টুল।
Unicode হলো একটি আন্তর্জাতিক স্ট্যান্ডার্ড যা পৃথিবীর সব ভাষার অক্ষর এবং চিহ্নকে ইউনিকোড মান প্রদান করে। Java-তে রেগুলার এক্সপ্রেশন (Regex) Unicode সমর্থন করে, যার মাধ্যমে আপনি বিভিন্ন ভাষার অক্ষর বা বিশেষ চিহ্নের উপর প্যাটার্ন মাচিং করতে পারবেন।
Java Regex এবং Unicode Support
Java Regex Unicode সমর্থন করে, যা আপনাকে Unicode চরিত্র এবং সিম্বলকে রেগুলার এক্সপ্রেশন প্যাটার্নের মধ্যে অন্তর্ভুক্ত করতে দেয়। Java 7 এবং পরবর্তী সংস্করণে Unicode প্যাটার্নগুলির সাথে কাজ করা সহজ এবং আরও কার্যকর হয়েছে। Unicode প্যাটার্ন এবং ক্যারেক্টার ক্লাসগুলি দিয়ে আপনি Unicode অক্ষর, ভাষা নির্দিষ্ট অক্ষর, এবং বিশেষ চিহ্ন চিহ্নিত করতে পারেন।
Unicode Escape Sequences
Java রেগুলার এক্সপ্রেশন Unicode অক্ষর এবং সিম্বলকে \u escape sequence দিয়ে চিহ্নিত করে।
\uXXXX: এখানেXXXXহল একটি চার ডিজিটের হেক্সাডেসিমাল সংখ্যা, যা একটি Unicode চরিত্রকে প্রতিনিধিত্ব করে।
যেমন, \u0041 হল Unicode escape sequence যা 'A' অক্ষরকে প্রতিনিধিত্ব করে।
Unicode Character Classes
Java রেগুলার এক্সপ্রেশন Unicode সাপোর্টের মাধ্যমে বিশেষ ধরনের character classes ব্যবহার করতে পারে, যেমন:
\p{L}: এটি Unicode এর সব letter অক্ষর চিহ্নিত করে (অর্থাৎ, সমস্ত অক্ষর, যেমন ইংরেজি, বাংলা, আরবি, চীনা অক্ষর ইত্যাদি)।\p{Lu}: এটি uppercase letters চিহ্নিত করে।\p{Ll}: এটি lowercase letters চিহ্নিত করে।\p{N}: এটি number characters চিহ্নিত করে।\p{P}: এটি punctuation marks চিহ্নিত করে।
এছাড়া, \P{...} অপারেটরটি negative প্যাটার্ন মাচ করতে ব্যবহৃত হয়। যেমন, \P{L} এর মানে হল যে এটি letter ছাড়া অন্যান্য সব ক্যারেক্টার মাচ করবে।
Unicode এবং Java Regex: Practical Examples
Example 1: Matching a Unicode Character Using \u
import java.util.regex.*;
public class UnicodeRegexExample {
public static void main(String[] args) {
String regex = "\\u0041"; // Unicode for 'A'
String input = "Hello A World";
// Compile regex pattern
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// Check if the pattern matches
if (matcher.find()) {
System.out.println("Found Unicode character 'A'");
} else {
System.out.println("Unicode character 'A' not found");
}
}
}
আউটপুট:
Found Unicode character 'A'
কোড বিশ্লেষণ:
\\u0041হল'A'অক্ষরের Unicode escape sequence।- এটি স্ট্রিং
"Hello A World"থেকে'A'অক্ষর খুঁজে বের করে।
Example 2: Matching Unicode Letters Using \p{L}
import java.util.regex.*;
public class UnicodeLetterExample {
public static void main(String[] args) {
String regex = "\\p{L}"; // Unicode for any letter
String input = "Hello, 123, こんにちは";
// Compile regex pattern
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// Find and print all Unicode letters
while (matcher.find()) {
System.out.println("Found letter: " + matcher.group());
}
}
}
আউটপুট:
Found letter: H
Found letter: e
Found letter: l
Found letter: l
Found letter: o
Found letter: こ
Found letter: ん
Found letter: に
Found letter: ち
Found letter: は
কোড বিশ্লেষণ:
\\p{L}একটি Unicode letter কে মাচ করবে, এটি ইংরেজি অক্ষর (H, e, l, o) এবং জাপানি অক্ষর (こ, ん, に, ち, は) উভয়ই মাচ করেছে।
Example 3: Matching Uppercase and Lowercase Unicode Letters Using \p{Lu} and \p{Ll}
import java.util.regex.*;
public class UpperLowerCaseUnicodeExample {
public static void main(String[] args) {
String regexUppercase = "\\p{Lu}"; // Unicode for uppercase letters
String regexLowercase = "\\p{Ll}"; // Unicode for lowercase letters
String input = "Hello World";
// Compile regex patterns
Pattern patternUppercase = Pattern.compile(regexUppercase);
Pattern patternLowercase = Pattern.compile(regexLowercase);
// Create matchers for both patterns
Matcher matcherUppercase = patternUppercase.matcher(input);
Matcher matcherLowercase = patternLowercase.matcher(input);
// Find and print uppercase letters
System.out.println("Uppercase letters:");
while (matcherUppercase.find()) {
System.out.println(matcherUppercase.group());
}
// Find and print lowercase letters
System.out.println("Lowercase letters:");
while (matcherLowercase.find()) {
System.out.println(matcherLowercase.group());
}
}
}
আউটপুট:
Uppercase letters:
H
W
Lowercase letters:
e
l
l
o
o
r
l
d
কোড বিশ্লেষণ:
\\p{Lu}হল Unicode uppercase letters এবং\\p{Ll}হল Unicode lowercase letters।- এখানে
"Hello World"স্ট্রিংটির মধ্যে বড় হাতের (uppercase) এবং ছোট হাতের (lowercase) অক্ষরগুলি আলাদা করে মাচ করা হয়েছে।
Example 4: Matching Non-Letter Characters Using \P{L}
import java.util.regex.*;
public class NonLetterExample {
public static void main(String[] args) {
String regex = "\\P{L}"; // Unicode for non-letter characters
String input = "Hello 123! World";
// Compile regex pattern
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// Find and print all non-letter characters
while (matcher.find()) {
System.out.println("Found non-letter: " + matcher.group());
}
}
}
আউটপুট:
Found non-letter:
Found non-letter: 1
Found non-letter: 2
Found non-letter: 3
Found non-letter: !
Found non-letter:
Found non-letter:
কোড বিশ্লেষণ:
\\P{L}এই রেগুলার এক্সপ্রেশনটি Unicode non-letter characters (যেমন স্পেস, ডিজিট, পাঙ্কচুয়েশন) চিহ্নিত করে।- এটি
"Hello 123! World"থেকে non-letter অংশগুলি মাচ করেছে।
Unicode এবং Java Regex: উপকারিতা
- Multilingual Support:
- Java Regex Unicode সমর্থন করার মাধ্যমে আপনি যে কোনো ভাষার অক্ষরের উপর মাচিং করতে পারেন। যেমন, ইংরেজি, বাংলা, আরবি, চীনা, ইত্যাদি অক্ষর।
- Cross-Cultural Text Processing:
- Unicode চরিত্রগুলি ব্যবহার করে আপনি আন্তর্জাতিক টেক্সট প্রক্রিয়ায় কাজ করতে পারেন, যেমন বিভিন্ন ভাষার ভ্যালিডেশন, বা বিশেষ ধরনের অক্ষরের সাথে কাজ।
- Extended Matching:
- Java Regex Unicode সাপোর্টের মাধ্যমে আপনি আন্তর্জাতিক অক্ষরের প্যাটার্ন, যেমন উপরের উদাহরণে দেখানো ইউনিকোড অক্ষরের ক্লাস, সহজেই চিহ্নিত করতে পারেন।
- Java Regex Unicode সাপোর্ট করে যা আপনাকে আন্তর্জাতিক অক্ষর, ভাষা, এবং বিশেষ চিহ্নের উপর প্যাটার্ন মাচিং করার সুযোগ দেয়।
- আপনি Unicode escape sequences এবং Unicode character classes ব্যবহার করে বিভিন্ন ধরনের অক্ষর এবং সিম্বল চিহ্নিত করতে পারেন।
- Java Regex Unicode সমর্থন আপনাকে বহু ভাষা এবং সিম্বলসের সাথে কাজ করতে সহায়তা করে, যা অনেক প্রোগ্রামিং পরিস্থিতিতে উপকারী হতে পারে, যেমন ডেটা ভ্যালিডেশন, ফাইল প্রসেসিং, ইত্যাদি।
Java রেগুলার এক্সপ্রেশন (Regex) এর মধ্যে Unicode Character Matching খুবই গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি বিভিন্ন ভাষা বা স্ক্রিপ্টের অক্ষরের সাথে কাজ করছেন। Unicode-এর সাহায্যে বিভিন্ন ভাষার অক্ষরগুলোকে একক স্ট্যান্ডার্ডে একত্রিত করা সম্ভব হয়। Java রেগুলার এক্সপ্রেশন প্যাটার্নে Unicode Character Matching এবং \p{IsLatin}, \p{IsGreek} এর মত Unicode Property Escapes ব্যবহার করা যায়, যা একটি নির্দিষ্ট ইউনিকোড ব্লকের মধ্যে চরিত্রগুলি মেলানোর জন্য সাহায্য করে।
1. Unicode Character Matching:
Unicode Character Matching ব্যবহার করে, আপনি নির্দিষ্ট ইউনিকোড ব্লক বা স্ক্রিপ্টের অক্ষরের সাথে ম্যাচ করতে পারেন। Java রেগুলার এক্সপ্রেশন \p{} সিম্বলের মাধ্যমে ইউনিকোড ব্লক বা প্রপার্টি নির্দিষ্ট করে ম্যাচিং করতে সক্ষম।
\p{} Syntax:
\p{Is<ScriptName>}: এটি ইউনিকোড স্ক্রিপ্ট বা ব্লক দিয়ে চরিত্রগুলোর ম্যাচ চেক করতে ব্যবহৃত হয়।\p{}এর মধ্যে ইউনিকোড স্ক্রিপ্ট বা প্রপার্টি সন্নিবেশ করা হয়।
উদাহরণস্বরূপ, আপনি \p{IsLatin} ব্যবহার করে ল্যাটিন অক্ষরগুলোর সাথে ম্যাচ করতে পারবেন, বা \p{IsGreek} ব্যবহার করে গ্রিক অক্ষরগুলোর সাথে।
2. \p{IsLatin} এবং \p{IsGreek} এর ব্যবহার:
\p{IsLatin}:
এটি সমস্ত ল্যাটিন অক্ষর (A-Z, a-z, 0-9 এবং কিছু অন্যান্য ক্যারেক্টার) মেলানোর জন্য ব্যবহার করা হয়।
\p{IsGreek}:
এটি সমস্ত গ্রিক অক্ষর (α, β, γ, δ, ... etc) মেলানোর জন্য ব্যবহৃত হয়।
উদাহরণ: \p{IsLatin} এবং \p{IsGreek} ব্যবহার করা:
import java.util.regex.*;
public class UnicodeCharacterMatchingExample {
public static void main(String[] args) {
// Pattern for Latin characters
Pattern latinPattern = Pattern.compile("[\\p{IsLatin}]+");
// Test string with Latin characters
Matcher latinMatcher = latinPattern.matcher("Hello World");
System.out.println("Latin Match: " + latinMatcher.matches()); // Output: true
// Pattern for Greek characters
Pattern greekPattern = Pattern.compile("[\\p{IsGreek}]+");
// Test string with Greek characters
Matcher greekMatcher = greekPattern.matcher("Γειά σας");
System.out.println("Greek Match: " + greekMatcher.matches()); // Output: true
// Test string that contains both Latin and Greek characters
Matcher mixedMatcher = latinPattern.matcher("Hello Γειά");
System.out.println("Mixed Match: " + mixedMatcher.matches()); // Output: false
}
}
Output:
Latin Match: true
Greek Match: true
Mixed Match: false
ব্যাখ্যা:
\p{IsLatin}: এই প্যাটার্নটি শুধুমাত্র ল্যাটিন অক্ষর (যেমন,A-Z,a-z) মেলাতে ব্যবহৃত হয়েছে। স্ট্রিং"Hello World"পুরোপুরি ল্যাটিন অক্ষরের মধ্যে রয়েছে, তাই এটি সফলভাবে ম্যাচ করেছে।\p{IsGreek}: এই প্যাটার্নটি গ্রিক অক্ষরের মধ্যে মেলানোর জন্য ব্যবহৃত হয়েছে।"Γειά σας"এই গ্রিক স্ট্রিংটি সম্পূর্ণ গ্রিক অক্ষরের মধ্যে রয়েছে, তাই এটি ম্যাচ করেছে।"Hello Γειά"স্ট্রিংটি একাধিক ভাষার অক্ষর ধারণ করে, তাই এটি শুধু ল্যাটিন অক্ষরের জন্য ম্যাচ হবে না।
3. Unicode Property Escapes:
Unicode Property Escapes (যেমন \p{IsLatin}, \p{IsGreek}) ব্যবহার করা হয় স্ট্রিংয়ের মধ্যে নির্দিষ্ট ইউনিকোড ক্যাটেগরি বা স্ক্রিপ্টের অক্ষরগুলো ম্যাচ করতে। এই প্যাটার্নগুলো ইউনিকোড প্রপার্টি সিস্টেমের অধীনে কাজ করে, যা Unicode ডাটাবেসে প্রতিটি ক্যারেক্টারের বৈশিষ্ট্য সংজ্ঞায়িত করা হয়েছে।
ইউনিকোড স্ক্রিপ্টের উদাহরণ:
\p{IsLatin}: ল্যাটিন স্ক্রিপ্টের চরিত্র।\p{IsGreek}: গ্রিক স্ক্রিপ্টের চরিত্র।\p{IsCyrillic}: সিরিলিক স্ক্রিপ্টের চরিত্র।\p{IsArabic}: আরবিক স্ক্রিপ্টের চরিত্র।\p{IsHiragana}: হিরাগানা স্ক্রিপ্টের চরিত্র।
4. বিস্তারিত ব্যবহার উদাহরণ:
Match Latin and Greek Characters Together:
import java.util.regex.*;
public class UnicodePatternExample {
public static void main(String[] args) {
// Matching Latin characters
Pattern latinPattern = Pattern.compile("[\\p{IsLatin}]+");
// Matching Greek characters
Pattern greekPattern = Pattern.compile("[\\p{IsGreek}]+");
// Test strings
String latinText = "Hello";
String greekText = "Χαίρετε";
// Matching Latin Text
Matcher latinMatcher = latinPattern.matcher(latinText);
System.out.println("Latin Match: " + latinMatcher.matches()); // true
// Matching Greek Text
Matcher greekMatcher = greekPattern.matcher(greekText);
System.out.println("Greek Match: " + greekMatcher.matches()); // true
// Test Mixed Characters
String mixedText = "Hello Χαίρετε";
Matcher mixedMatcher = latinPattern.matcher(mixedText);
System.out.println("Mixed Match: " + mixedMatcher.matches()); // false
}
}
Output:
Latin Match: true
Greek Match: true
Mixed Match: false
ব্যাখ্যা:
[\\p{IsLatin}]+: এই প্যাটার্নটি শুধুমাত্র ল্যাটিন অক্ষরগুলি মেলাবে।"Hello"স্ট্রিংটি শুধুমাত্র ল্যাটিন অক্ষরের মধ্যে রয়েছে, তাই এটি ম্যাচ করবে।[\\p{IsGreek}]+: এই প্যাটার্নটি শুধুমাত্র গ্রিক অক্ষরগুলির মধ্যে মেলাবে।"Χαίρετε"এই গ্রিক স্ট্রিংটি সম্পূর্ণ গ্রিক অক্ষর দিয়ে গঠিত, তাই এটি ম্যাচ করবে।- Mixed Text Matching:
"Hello Χαίρετε"স্ট্রিংটি মিশ্রিত ল্যাটিন এবং গ্রিক অক্ষরের মধ্যে রয়েছে, তাই"\\p{IsLatin}"প্যাটার্নের সাথে মিলবে না, কারণ এটি শুধুমাত্র ল্যাটিন অক্ষর মেলানোর জন্য ডিজাইন করা।
- Unicode Character Matching এর মাধ্যমে আপনি Java রেগুলার এক্সপ্রেশনে ইউনিকোডের নির্দিষ্ট ব্লক বা স্ক্রিপ্টের অক্ষরগুলো মেলাতে পারেন।
\p{IsLatin}এবং\p{IsGreek}ব্যবহার করে আপনি যথাক্রমে ল্যাটিন এবং গ্রিক অক্ষরের জন্য প্যাটার্ন মেলাতে পারেন।- এই ধরনের প্যাটার্নগুলি আপনার রেগুলার এক্সপ্রেশনকে বিভিন্ন ভাষা বা স্ক্রিপ্টের সাপোর্ট দিতে সহায়তা করে, বিশেষত যদি আপনি আন্তর্জাতিক বা বহুভাষিক ডেটা প্রসেস করতে চান।
Java Regular Expressions (Regex) এর মধ্যে Unicode Blocks এবং Script Matching হলো এমন দুটি শক্তিশালী বৈশিষ্ট্য যা স্ট্রিং ম্যানিপুলেশন এবং প্যাটার্ন ম্যাচিংয়ের ক্ষেত্রে বিশেষভাবে কাজে আসে। এই দুটি বৈশিষ্ট্য Java 7 থেকে আসা Unicode Character Classes এর মাধ্যমে স্ট্রিংয়ের মধ্যে ইউনিকোড ব্লক এবং স্ক্রিপ্ট চিহ্নিত করতে সাহায্য করে।
1. Unicode Blocks in Java Regex:
Java রেগুলার এক্সপ্রেশনে Unicode Blocks ব্যবহার করে আপনি একটি নির্দিষ্ট ইউনিকোড ব্লকে থাকা অক্ষরগুলোকে ম্যাচ করতে পারেন। এটি Unicode Character Class হিসেবে কাজ করে, যা একটি নির্দিষ্ট ইউনিকোড ব্লকের অক্ষরের সাথে মিল খুঁজে।
Unicode Block এর Syntax:
\p{Is<BlockName>}
এখানে, Is<BlockName> একটি ইউনিকোড ব্লকের নাম যা আপনি প্যাটার্নে ব্যবহার করতে পারেন। কিছু সাধারণ Unicode Block গুলি হলো:
IsBasic_Latin: এর মধ্যে 0-127 পর্যন্ত ASCII অক্ষর।IsLatin_1_Supplement: 128-255 পর্যন্ত অক্ষর।IsGreek: গ্রীক ভাষার অক্ষর।IsCyrillic: সিরিলিক ভাষার অক্ষর।IsHan: চীনা, জাপানি, কোরিয়ান হানজির অক্ষর।
উদাহরণ:
import java.util.regex.*;
public class UnicodeBlockExample {
public static void main(String[] args) {
// Unicode block matching for Greek characters
String text = "Hello, this is a test with Greek characters: α, β, γ";
// Pattern to match Greek letters
Pattern pattern = Pattern.compile("\\p{IsGreek}+");
Matcher matcher = pattern.matcher(text);
// Find and print matches
while (matcher.find()) {
System.out.println("Found Greek match: " + matcher.group());
}
}
}
Output:
Found Greek match: α
Found Greek match: β
Found Greek match: γ
ব্যাখ্যা:
\p{IsGreek}+প্যাটার্নটি Greek ইউনিকোড ব্লকের অক্ষর খুঁজে বের করতে ব্যবহৃত হয়েছে। এখানেα,β, এবংγঅক্ষরগুলিকে মেলা হয়েছে, কারণ তারা Greek ব্লকের অংশ।
2. Script Matching in Java Regex:
Script Matching ইউনিকোড স্ক্রিপ্টের সাথে সম্পর্কিত অক্ষরগুলো খুঁজে বের করতে ব্যবহৃত হয়। এটি Unicode Scripts এর উপর ভিত্তি করে প্যাটার্ন ম্যাচিং করার একটি পদ্ধতি। Unicode Scripts এমন একটি নির্দিষ্ট ইউনিকোড ব্লক যেখানে একটি ভাষার অক্ষর থাকে। যেমন, ইংরেজি অক্ষর Latin স্ক্রিপ্টের অংশ, আর হিন্দি বা বাংলা অক্ষর Devanagari বা Bengali স্ক্রিপ্টের অংশ।
Script Matching এর Syntax:
\p{Is<ScriptName>}
এখানে, Is<ScriptName> নির্দেশ করে যে এটি একটি নির্দিষ্ট স্ক্রিপ্টের অক্ষরের সাথে মিলাবে। কিছু সাধারণ Unicode Scripts হলো:
IsLatin: ল্যাটিন স্ক্রিপ্টের অক্ষর।IsCyrillic: সিরিলিক স্ক্রিপ্টের অক্ষর।IsDevanagari: দেবনাগরি স্ক্রিপ্টের অক্ষর।IsBengali: বাংলা স্ক্রিপ্টের অক্ষর।
উদাহরণ:
import java.util.regex.*;
public class ScriptMatchingExample {
public static void main(String[] args) {
// String containing English, Hindi, and Bengali characters
String text = "Hello, नमस्ते, হ্যালো";
// Pattern to match Hindi characters (Devanagari script)
Pattern devanagariPattern = Pattern.compile("\\p{IsDevanagari}+");
Matcher devanagariMatcher = devanagariPattern.matcher(text);
// Find and print matches for Devanagari script
while (devanagariMatcher.find()) {
System.out.println("Found Hindi match: " + devanagariMatcher.group());
}
// Pattern to match Bengali characters (Bengali script)
Pattern bengaliPattern = Pattern.compile("\\p{IsBengali}+");
Matcher bengaliMatcher = bengaliPattern.matcher(text);
// Find and print matches for Bengali script
while (bengaliMatcher.find()) {
System.out.println("Found Bengali match: " + bengaliMatcher.group());
}
}
}
Output:
Found Hindi match: नमस्ते
Found Bengali match: হ্যালো
ব্যাখ্যা:
\p{IsDevanagari}+প্যাটার্নটি Devanagari স্ক্রিপ্টের অক্ষরগুলি খুঁজে বের করতে ব্যবহৃত হয়, যেমনनमस्ते(হিন্দি ভাষার অক্ষর)।\p{IsBengali}+প্যাটার্নটি Bengali স্ক্রিপ্টের অক্ষরগুলি খুঁজে বের করতে ব্যবহৃত হয়, যেমনহ্যালো(বাংলা ভাষার অক্ষর)।
3. Unicode Block এবং Script Matching এর ব্যবহার:
Unicode Blocks এবং Script Matching ব্যবহার করে আপনি বিশেষ ইউনিকোড ব্লক বা স্ক্রিপ্টের অক্ষরের সাথে স্ট্রিংয়ের প্যাটার্ন ম্যাচ করতে পারেন। এই পদ্ধতি বিভিন্ন ভাষার মধ্যে কাজ করার সময় বিশেষভাবে উপকারী, যেমন:
- বিশেষ ভাষার অক্ষর চিহ্নিত করা (যেমন বাংলা, হিন্দি, গ্রীক)
- বিভিন্ন স্ক্রিপ্টের অক্ষর প্রক্রিয়া করা (যেমন ল্যাটিন, সিরিলিক)
অন্যান্য উদাহরণ:
বিশেষ ল্যাটিন অক্ষর খুঁজে বের করা:
Pattern latinPattern = Pattern.compile("\\p{IsLatin}+"); Matcher latinMatcher = latinPattern.matcher("Hello"); while (latinMatcher.find()) { System.out.println("Found Latin match: " + latinMatcher.group()); }Cyrillic স্ক্রিপ্টের অক্ষর খুঁজে বের করা:
Pattern cyrillicPattern = Pattern.compile("\\p{IsCyrillic}+"); Matcher cyrillicMatcher = cyrillicPattern.matcher("Привет"); while (cyrillicMatcher.find()) { System.out.println("Found Cyrillic match: " + cyrillicMatcher.group()); }
- Unicode Blocks এবং Script Matching Java Regex এ খুবই শক্তিশালী টুলস যা আপনাকে বিভিন্ন স্ক্রিপ্ট বা ইউনিকোড ব্লকের অক্ষরের সাথে স্ট্রিংয়ের মেলানো এবং ফিল্টার করতে সাহায্য করে।
- Unicode Blocks এবং Unicode Scripts ব্যবহার করে আপনি বিভিন্ন ভাষার অক্ষরের মেলানো এবং প্রক্রিয়াকরণ করতে পারেন, যা বিভিন্ন আন্তর্জাতিক ভাষার কাজ করতে সাহায্য করে।
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ক্লাসগুলি স্ট্রিংয়ের মধ্যে প্যাটার্ন খোঁজার এবং মেলানোর জন্য ব্যবহৃত হয়।
Internationalization (i18n) হল একটি সফটওয়্যার ডেভেলপমেন্ট পদ্ধতি যা বিভিন্ন ভাষায় এবং সংস্কৃতিতে সফটওয়্যার চালানোর জন্য সেটআপ করা হয়। জাভাতে Regex (Regular Expressions) ব্যবহার করে আন্তর্জাতিককরণ বা i18n এর জন্য বিভিন্ন ধরনের টেক্সট যাচাই এবং সংস্কৃতি নির্দিষ্ট বৈশিষ্ট্য পরিচালনা করা সম্ভব। Regex ব্যবহার করে বিভিন্ন ভাষার স্ট্রিং বা তথ্যের নির্দিষ্ট প্যাটার্ন যাচাই করা যেতে পারে, যেমন ফোন নম্বর, মুদ্রা, তারিখ, ইমেইল অ্যাড্রেস ইত্যাদি, যা একাধিক ভাষায় বা সংস্কৃতিতে ব্যবহৃত হতে পারে।
Internationalization (i18n) এর জন্য Regex ব্যবহার:
Regex জাভাতে internationalization (i18n) এর জন্য খুবই উপকারী হতে পারে যখন আপনি এমন কিছু যাচাই করতে চান যা নির্দিষ্ট দেশ বা ভাষার জন্য উপযুক্ত। উদাহরণস্বরূপ, ফোন নম্বর, তারিখ ফরম্যাট, মুদ্রার চিহ্ন, বা ভাষা নির্দিষ্ট অন্যান্য ফরম্যাট যা সংস্কৃতির ভিত্তিতে পরিবর্তিত হতে পারে।
নিচে কিছু উদাহরণ দেওয়া হলো যেখানে Regex ব্যবহার করে i18n নিশ্চিত করা যায়।
1. Phone Number Validation (i18n):
বিশ্বব্যাপী ফোন নম্বরের ফরম্যাটগুলি বিভিন্ন হতে পারে। কিছু দেশে + চিহ্ন থাকতে পারে, কিছু দেশে কেবল ডিজিট থাকতে পারে, আবার কিছু দেশে হাইফেনের মাধ্যমে পৃথকীকরণ করা হতে পারে। এখানে একটি সাধারণ Phone Number Validation রেগুলার এক্সপ্রেশন তৈরি করা হলো।
Phone Number Validation Example:
import java.util.regex.*;
public class PhoneNumberValidation {
public static void main(String[] args) {
// Example phone numbers for various countries
String[] phoneNumbers = {
"+1-800-555-1234", // US Format
"+44 20 7946 0958", // UK Format
"+91-9876543210", // India Format
"9876543210", // India without country code
"+33 1 70 18 99 80" // France Format
};
// Regex for validating international phone numbers
String phoneRegex = "^\\+?\\d{1,4}[-\\s]?\\(?\\d{1,4}\\)?[-\\s]?\\d{1,4}[-\\s]?\\d{1,4}[-\\s]?\\d{1,4}$";
// Compile the regex pattern
Pattern pattern = Pattern.compile(phoneRegex);
// Validate each phone number
for (String phoneNumber : phoneNumbers) {
Matcher matcher = pattern.matcher(phoneNumber);
if (matcher.matches()) {
System.out.println(phoneNumber + " is a valid phone number.");
} else {
System.out.println(phoneNumber + " is not a valid phone number.");
}
}
}
}
ব্যাখ্যা:
- Regex:
^\\+?\\d{1,4}[-\\s]?\\(?\\d{1,4}\\)?[-\\s]?\\d{1,4}[-\\s]?\\d{1,4}[-\\s]?\\d{1,4}$\\+?:+চিহ্ন হতে পারে, তবে এটি ঐচ্ছিক।\\d{1,4}: ১ থেকে ৪ ডিজিট। এটি দেশ কোড বা ফোন নম্বরের অংশ হতে পারে।[-\\s]?: হাইফেন বা স্পেস থাকতে পারে (ঐচ্ছিক)।\\(?\\d{1,4}\\)?: অঞ্চল কোড, যা ঐচ্ছিকভাবে প্যারেনথেসিসের মধ্যে থাকতে পারে।[-\\s]?: পুনরায় হাইফেন বা স্পেস থাকতে পারে।\\d{1,4}: ফোন নম্বরের বাকি অংশ, যা ১ থেকে ৪ ডিজিট হতে পারে।
আউটপুট:
+1-800-555-1234 is a valid phone number.
+44 20 7946 0958 is a valid phone number.
+91-9876543210 is a valid phone number.
9876543210 is a valid phone number.
+33 1 70 18 99 80 is a valid phone number.
2. Date Format Validation (i18n):
তারিখের ফরম্যাট বিভিন্ন দেশে বিভিন্ন হতে পারে। উদাহরণস্বরূপ, মার্কিন যুক্তরাষ্ট্রে তারিখের ফরম্যাট হতে পারে MM/DD/YYYY, কিন্তু ইউরোপে এটি DD/MM/YYYY হতে পারে। এমন পরিস্থিতিতে Regex ব্যবহার করে নির্দিষ্ট ফরম্যাট যাচাই করা সম্ভব।
Date Format Validation Example (MM/DD/YYYY):
import java.util.regex.*;
public class DateFormatValidation {
public static void main(String[] args) {
// Example dates in MM/DD/YYYY format
String[] dates = {
"12/31/2020", // Valid
"02/29/2020", // Valid leap year
"02/30/2020", // Invalid date
"13/12/2020", // Invalid month
"01/01/2021" // Valid
};
// Regex for validating MM/DD/YYYY format
String dateRegex = "^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/([12][0-9]{3})$";
// Compile the regex pattern
Pattern pattern = Pattern.compile(dateRegex);
// Validate each date
for (String date : dates) {
Matcher matcher = pattern.matcher(date);
if (matcher.matches()) {
System.out.println(date + " is a valid date.");
} else {
System.out.println(date + " is not a valid date.");
}
}
}
}
ব্যাখ্যা:
- Regex:
^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/([12][0-9]{3})$(0[1-9]|1[0-2]): ১ থেকে ১২ পর্যন্ত মাসের সংখ্যা।(0[1-9]|[12][0-9]|3[01]): ১ থেকে ৩১ পর্যন্ত দিন।([12][0-9]{3}): ৪ ডিজিটের সাল (যেমন 2020, 1999)।
আউটপুট:
12/31/2020 is a valid date.
02/29/2020 is a valid date.
02/30/2020 is not a valid date.
13/12/2020 is not a valid date.
01/01/2021 is a valid date.
3. Currency Symbol Validation (i18n):
বিশ্বব্যাপী বিভিন্ন দেশের মুদ্রা চিহ্ন এবং মানের ফরম্যাট আলাদা। উদাহরণস্বরূপ, USD এর জন্য $, EUR এর জন্য €, এবং INR এর জন্য ₹ চিহ্ন ব্যবহার করা হয়। আপনি Regex ব্যবহার করে এই মুদ্রা চিহ্নের বৈধতা যাচাই করতে পারেন।
Currency Validation Example (USD, EUR, INR):
import java.util.regex.*;
public class CurrencyValidation {
public static void main(String[] args) {
// Example currency amounts
String[] currencies = {
"$123.45", // USD
"€99.99", // EUR
"₹5000", // INR
"$1234.56", // USD
"£300", // Invalid currency symbol
"1000¥" // Invalid currency symbol
};
// Regex for validating currency (USD, EUR, INR)
String currencyRegex = "^[\\$€₹]\\d+(\\.\\d{1,2})?$";
// Compile the regex pattern
Pattern pattern = Pattern.compile(currencyRegex);
// Validate each currency
for (String currency : currencies) {
Matcher matcher = pattern.matcher(currency);
if (matcher.matches()) {
System.out.println(currency + " is a valid currency format.");
} else {
System.out.println(currency + " is not a valid currency format.");
}
}
}
}
ব্যাখ্যা:
- Regex:
^[\\$€₹]\\d+(\\.\\d{1,2})?$^[\\$€₹]: এটি স্ট্রিংয়ের শুরুতে$,€, বা₹এর মধ্যে একটি মুদ্রা চিহ্ন চেক করে।\\d+: এটি একটি বা একাধিক ডিজিট চেক করে (যেমন 123, 1234)।(\\.\\d{1,2})?: এটি ঐচ্ছিক দশমিক এবং ১ অথবা ২ ডিজিটের সেন্ট চেক করে।
আউটপুট:
$123.45 is a valid currency format.
€99.99 is a valid currency format.
₹5000 is a valid currency format.
$1234.56 is a valid currency format.
£300 is not a valid currency format.
1000¥ is not a valid currency format.
- Regex ব্যবহার করে আপনি internationalization (i18n) প্রক্রিয়ায় বিভিন্ন দেশের ভিন্ন ভিন্ন ফরম্যাটের জন্য input validation করতে পারেন, যেমন ফোন নম্বর, তারিখ, মুদ্রা চিহ্ন, ইমেইল অ্যাড্রেস ইত্যাদি।
- জাভাতে Regex দ্বারা আপনি আন্তর্জাতিক ফরম্যাটে সঠিকভাবে ইনপুট যাচাই করতে পারবেন এবং আপনার সফটওয়্যারটি বিভিন্ন সংস্কৃতিতে সঠিকভাবে কাজ করবে।
Read more