Lookahead এবং Lookbehind Assertions হল regular expressions (regex) এর গুরুত্বপূর্ণ অংশ যা ব্যবহারকারীকে টেক্সটের নির্দিষ্ট অংশে মাচিং বা যাচাই করার জন্য সাহায্য করে, কিন্তু তারা যেখানেই মাচিং করুক না কেন, তাদের নিজস্ব মাচিং আউটপুটে অংশগ্রহণ করে না। এগুলো সাধারণত assertions হিসাবে পরিচিত, এবং এগুলি টেক্সটের আগে বা পরে কিছু অংশ থাকা দরকার, কিন্তু সেই অংশটি মাচিংয়ের অংশ হিসেবে গণনা করা হয় না।
Lookahead Assertions
Lookahead Assertions মূলত একটি প্যাটার্নের পরে কিছু শর্ত (condition) পরীক্ষা করতে ব্যবহৃত হয়, কিন্তু সেই শর্তের অংশটিকে মাচিং হিসেবে ধরবে না। এটি আপনাকে পরীক্ষা করতে সাহায্য করে যে একটি প্যাটার্নটি অন্য প্যাটার্নের আগে বা পরে উপস্থিত আছে কিনা।
Positive Lookahead:
- Positive Lookahead প্যাটার্নটি বলে যে, একটি নির্দিষ্ট প্যাটার্ন পরবর্তী কোনো অবস্থানে উপস্থিত হতে হবে, কিন্তু তা মাচিংয়ের অংশ হবে না।
- সিনট্যাক্স:
X(?=Y)- এখানে,
Xহল আপনার মূল প্যাটার্ন এবং(?=Y)হল positive lookahead, যা নির্দেশ করে যেXএর পরYথাকতে হবে।
- এখানে,
উদাহরণ:
import java.util.regex.*;
public class PositiveLookaheadExample {
public static void main(String[] args) {
String regex = "\\d(?=\\D)"; // A digit followed by a non-digit character
String input = "123a 456b 789c";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Match: " + matcher.group());
}
}
}
আউটপুট:
Match: 1
Match: 4
Match: 7
কোড বিশ্লেষণ:
\\d(?=\\D)এই রেগুলার এক্সপ্রেশনটি নির্দেশ করে যে\\d(একটি ডিজিট) এমনভাবে মাচ করতে হবে যে তার পরবর্তী চরিত্রটি কোনো ডিজিট নয় (\\D)।- এটি "123a" থেকে
1, "456b" থেকে4, এবং "789c" থেকে7কে মাচ করেছে, কারণ প্রত্যেকটি ডিজিটের পর একটি অ-ডিজিট রয়েছে।
Negative Lookahead:
- Negative Lookahead প্যাটার্নটি বলে যে, একটি নির্দিষ্ট প্যাটার্ন পরবর্তী কোনো অবস্থানে উপস্থিত হবে না। এটি negative assertion হিসেবে কাজ করে।
- সিনট্যাক্স:
X(?!Y)- এখানে,
Xহল আপনার মূল প্যাটার্ন এবং(?!Y)হল negative lookahead, যা নির্দেশ করে যেXএর পরYউপস্থিত হবে না।
- এখানে,
উদাহরণ:
import java.util.regex.*;
public class NegativeLookaheadExample {
public static void main(String[] args) {
String regex = "\\d(?!\\d)"; // A digit not followed by another digit
String input = "123a 456b 789";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Match: " + matcher.group());
}
}
}
আউটপুট:
Match: 3
Match: 6
Match: 9
কোড বিশ্লেষণ:
\\d(?!\\d)এই রেগুলার এক্সপ্রেশনটি বলে যে, একটি ডিজিটের পর কোনো আরেকটি ডিজিট থাকতে পারবে না।- এটি "123a" থেকে
3, "456b" থেকে6, এবং "789" থেকে9মাচ করেছে কারণ তারা তাদের পরবর্তী ডিজিট ছাড়া আসে।
Lookbehind Assertions
Lookbehind Assertions এমন একটি প্যাটার্ন যা চেক করে যে কোনও নির্দিষ্ট প্যাটার্ন একটি নির্দিষ্ট অবস্থানের আগে উপস্থিত ছিল কিনা। এটি দুটি ধরনের হতে পারে:
Positive Lookbehind:
- Positive Lookbehind প্যাটার্নটি বলে যে, একটি প্যাটার্ন একটি নির্দিষ্ট অবস্থানের আগে উপস্থিত থাকতে হবে।
- সিনট্যাক্স:
(?<=Y)X- এখানে,
Xহল আপনার মূল প্যাটার্ন এবং(?<=Y)হল positive lookbehind, যা নির্দেশ করে যেYএর আগেXউপস্থিত থাকতে হবে।
- এখানে,
উদাহরণ:
import java.util.regex.*;
public class PositiveLookbehindExample {
public static void main(String[] args) {
String regex = "(?<=@)\\w+"; // Match word after '@'
String input = "email@example.com contact@domain.com";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Match: " + matcher.group());
}
}
}
আউটপুট:
Match: example
Match: domain
কোড বিশ্লেষণ:
(?<=@)\\w+এই রেগুলার এক্সপ্রেশনটি বলে যে,@চিহ্নের পরে যেকোনো শব্দ মাচ করতে হবে।- এটি
email@example.comথেকেexampleএবংcontact@domain.comথেকেdomainমাচ করেছে।
Negative Lookbehind:
- Negative Lookbehind প্যাটার্নটি বলে যে, একটি প্যাটার্ন একটি নির্দিষ্ট অবস্থানের আগে উপস্থিত হবে না।
- সিনট্যাক্স:
(?<!Y)X- এখানে,
Xহল আপনার মূল প্যাটার্ন এবং(?<!Y)হল negative lookbehind, যা নির্দেশ করে যেXএর আগেYথাকতে পারবে না।
- এখানে,
উদাহরণ:
import java.util.regex.*;
public class NegativeLookbehindExample {
public static void main(String[] args) {
String regex = "(?<!@)\\w+"; // Match words not preceded by '@'
String input = "email@example.com contact@domain.com hello world";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("Match: " + matcher.group());
}
}
}
আউটপুট:
Match: hello
Match: world
কোড বিশ্লেষণ:
(?<!@)\\w+এই রেগুলার এক্সপ্রেশনটি বলে যে, যদি একটি শব্দের আগে@না থাকে, তবে সেটি মাচ করতে হবে।- এটি
"hello world"থেকেhelloএবংworldমাচ করেছে, কারণ তাদের আগে@নেই।
Lookahead এবং Lookbehind Assertions এর ব্যবহার:
- Complex Pattern Matching:
- Lookahead এবং Lookbehind Assertions আপনাকে স্ট্রিংয়ের নির্দিষ্ট অংশে মাচিং বা যাচাই করতে সাহায্য করে, যেমন একটি স্ট্রিংয়ের আগে বা পরে কিছু নির্দিষ্ট শর্ত আছে কিনা।
- Text Validation:
- এগুলো সাধারণত input validation বা format validation এ ব্যবহৃত হয়, যেমন কোনো ফরম্যাটে থাকা ইমেইল, ফোন নম্বর, বা পাসওয়ার্ড চেক করা।
- Excluding Certain Patterns:
- Negative Lookahead এবং Negative Lookbehind এর সাহায্যে আপনি স্ট্রিং থেকে নির্দিষ্ট অংশ বাদ দিতে পারেন, যেমন কিছু শব্দের আগে বা পরে কিছু নির্দিষ্ট প্যাটার্ন নেই তা নিশ্চিত করা।
Lookahead এবং Lookbehind Assertions আপনাকে Java Regular Expressions এ অত্যন্ত শক্তিশালী প্যাটার্ন মাচিং সক্ষমতা প্রদান করে। Lookahead (positive এবং negative) এবং Lookbehind (positive এবং negative) স্ট্রিংয়ের নির্দিষ্ট অবস্থান চেক করতে সাহায্য করে, যা টেক্সট প্রক্রিয়ায় খুবই উপকারী হতে পারে।
Read more