Regular Expressions (RegExp) অত্যন্ত শক্তিশালী এবং প্রভাবশালী একটি টুল, যা টেক্সট ম্যানিপুলেশন, অনুসন্ধান, এবং পরিবর্তন করতে ব্যবহৃত হয়। তবে, সঠিকভাবে RegExp ব্যবহার না করলে এটি কোডের পারফর্ম্যান্স খারাপ করতে পারে এবং ভুল আচরণ সৃষ্টি করতে পারে। সুতরাং, RegExp ব্যবহারে কিছু Best Practices এবং Advanced Techniques অনুসরণ করা উচিত।
RegExp এর বেস্ট প্র্যাকটিস
- স্পেসিফিক প্যাটার্ন ব্যবহার করুন
যখন আপনি RegExp তৈরি করেন, তখন আপনার প্যাটার্নের উদ্দেশ্য স্পষ্ট হতে হবে। আপনার প্যাটার্নকে খুব সাধারণ (যেমন.*) করার চেয়ে, যতটা সম্ভব স্পেসিফিক করুন।- ভুল:
.*\d.*— এই প্যাটার্নটি যেকোনো স্থানে একটি সংখ্যা খুঁজবে, তবে এর কার্যকারিতা কম হতে পারে। - সঠিক:
^\d{3}-\d{2}-\d{4}$— এখানে, সুনির্দিষ্ট প্যাটার্নে ডেটা ফরম্যাট খুঁজে বের করা হচ্ছে (যেমন সোসিয়াল সিকিউরিটি নম্বর)।
- ভুল:
Non-greedy matching ব্যবহার করুন
যখন আপনি একটি টেক্সটের মধ্যে বিভিন্ন অংশ অনুসন্ধান করছেন, তখন.*বা.+ব্যবহার করলে এটি পুরো টেক্সট পর্যন্ত ম্যাচ হতে পারে, যা কখনো কখনো আপনার কাঙ্ক্ষিত ফলাফল দেয় না। বরং, non-greedy matching ব্যবহার করুন, যেমন.*?বা.+?।উদাহরণ:
let regex = /<div.*?>.*?<\/div>/g;এখানে
.*?হলো non-greedy প্যাটার্ন, যা<div>ট্যাগের মধ্যে থাকা কমপ্লেক্স কন্টেন্টটি দ্রুত এবং সঠিকভাবে খুঁজে বের করবে।Character classes ব্যবহার করুন
সাধারণ[a-zA-Z0-9]এর বদলে, যেখানে সম্ভব, Unicode বা অন্যান্য স্ট্যান্ডার্ড character classes ব্যবহার করুন। যেমন\w,\d, এবং\sব্যবহার করা সহজ এবং সাধারণ কাজগুলো দ্রুত সম্পন্ন করতে সাহায্য করে।উদাহরণ:
let regex = /\w+/; // এটি একটি শব্দের জন্য let regex2 = /\d{3}-\d{2}-\d{4}/; // সঠিক ফরম্যাটের সোসিয়াল সিকিউরিটি নম্বর- RegExp তে ক্যাশিং এবং মেমরি ব্যবস্থাপনা
জটিল RegExp গুলি, বিশেষত যখন.*বা+ব্যবহৃত হয়, তখন তারা সময় নিয়ে অনেক মেমরি ব্যবহার করতে পারে। এধরনের প্যাটার্নের জন্য প্রপার ক্যাশিং এবং সাবধানে প্যাটার্ন ডিজাইন করা উচিত। Anchors ব্যবহার করুন
স্ট্রিংয়ের শুরু বা শেষ থেকে মিল খুঁজতে anchors ব্যবহার করুন। যেমন^(start of string) এবং$(end of string)। এগুলি RegExp কে আরও দ্রুত কার্যকর করতে সহায়তা করে।উদাহরণ:
let regex = /^abc/; // স্ট্রিংয়ের শুরুতে 'abc' খুঁজে বের করবে let regex2 = /abc$/; // স্ট্রিংয়ের শেষে 'abc' খুঁজে বের করবে- Testing এবং Debugging
RegExp তৈরি এবং ব্যবহার করার সময় টেস্টিং অপরিহার্য। আপনি RegExp tester tools (যেমন RegExr) ব্যবহার করতে পারেন আপনার প্যাটার্ন পরীক্ষা করার জন্য এবং এটি কীভাবে কাজ করছে তা নিশ্চিত করতে।
RegExp এর অ্যাডভান্সড টেকনিক
Lookahead এবং Lookbehind Assertions
Lookahead এবং Lookbehind assertions RegExp-এ শক্তিশালী টেকনিক, যেগুলি "behind" বা "ahead" অংশে কোনো নির্দিষ্ট শর্ত পূরণ করলে মিল খুঁজে বের করে। এগুলি ব্যবহার করে আপনি কিছু অংশ মেলাতে পারেন যেগুলি আপনার ম্যাচের অংশ হতে চাই না, কিন্তু সেগুলির উপস্থিতি প্রয়োজন।- Lookahead (Positive Lookahead):
(?=...) - Negative Lookahead:
(?!...) - Lookbehind (Positive Lookbehind):
(?<=...) - Negative Lookbehind:
(?<!...)
উদাহরণ:
// Positive Lookahead (তিনটি সংখ্যা পরে একটি ড্যাশ) let regex = /\d{3}(?=-)/; let str = "123-456"; console.log(regex.test(str)); // true // Negative Lookahead (এটি পরবর্তী ক্ষেত্রে - নেই) let regex2 = /\d{3}(?!-)/; let str2 = "123456"; console.log(regex2.test(str2)); // true- Lookahead (Positive Lookahead):
Named Capture Groups
RegExp-এ Named Capture Groups ব্যবহার করে আপনি গ্রুপের নাম দিয়ে ঐ গ্রুপকে রেফারেন্স করতে পারেন, যা কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণ সহজ করে।সিনট্যাক্স:
let regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; let str = "2024-12-16"; let match = str.match(regex); console.log(match.groups.year); // "2024"Unicode Property Escapes
ES2018 থেকে JavaScript RegExp Unicode Property Escapes সমর্থন করে, যার মাধ্যমে আপনি চরিত্রের প্রপার্টি ব্যবহার করে ম্যাচ করতে পারেন, যেমন\p{Letter}বা\p{Emoji}।উদাহরণ:
let regex = /\p{Letter}/gu; // সমস্ত অক্ষর মিলবে let str = "Hello 123"; console.log(regex.test(str)); // trueBackreferences এবং Named Backreferences
Backreferences এবং Named Backreferences আপনাকে পূর্বের গ্রুপগুলোর মান পুনরায় ব্যবহার করতে সাহায্য করে। এতে আপনি একটি গ্রুপের মান ধরে রাখতে পারেন এবং পরবর্তী অংশে এটি মিলাতে পারেন।উদাহরণ:
let regex = /(?<word>\w+)\s\k<word>/; let str = "hello hello"; console.log(regex.test(str)); // true- Recursive Patterns
Recursive Patterns RegExp-এ একটি বিশেষ ক্ষমতা যা একটি গ্রুপকে নিজেই পুনরায় কল করতে সক্ষম করে। যদিও JavaScript এ এটি সরাসরি সমর্থিত নয়, তবে কিছু বিকল্প কৌশল ব্যবহার করে এটি সিমুলেট করা যেতে পারে।
RegExp Optimization
- Avoid Unnecessary Grouping
গ্রুপিং প্রয়োজনীয় হলে ব্যবহার করুন, কিন্তু অপ্রয়োজনীয় গ্রুপিং থেকে এড়িয়ে চলুন। এটি RegExp-কে বেশি সঠিক এবং দ্রুত কার্যকরী করতে সাহায্য করে। - Minimize Lookahead/Lookbehind Usage
Lookahead এবং Lookbehind assertions শক্তিশালী হলেও, এগুলি অতিরিক্ত কমপ্লেক্স এবং কিছু ক্ষেত্রে পারফর্ম্যান্সে প্রভাব ফেলতে পারে। অতএব, এগুলি ব্যবহার করার আগে নিশ্চিত হয়ে নিন যে এর প্রয়োগ প্রয়োজন।
সারাংশ
RegExp ব্যবহার করার সময় Best Practices অনুসরণ করা গুরুত্বপূর্ণ, যাতে আপনার প্যাটার্ন দ্রুত, কার্যকরী এবং কোডের জন্য পাঠযোগ্য হয়। Advanced Techniques যেমন Lookahead, Lookbehind, Named Capture Groups, এবং Unicode Property Escapes ব্যবহার করে আপনি আরও জটিল টেক্সট ম্যানিপুলেশন করতে পারেন। এসব টেকনিক ব্যবহার করে আপনি আপনার RegExp কে আরও শক্তিশালী এবং কার্যকরী করতে পারবেন, এবং কোডের পারফর্ম্যান্স উন্নত করতে পারবেন।
JavaScript RegExp ব্যবহার করার সময়, কোডের readability (পঠনযোগ্যতা) এবং maintainability (রক্ষণাবেক্ষণযোগ্যতা) নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। একটি সঠিক এবং পরিষ্কারভাবে লেখা RegExp কোড সময়ের সঙ্গে আরও কার্যকরী হবে এবং সহজেই অন্য ডেভেলপারদের বা ভবিষ্যতের জন্য পরিচালনা করা যাবে।
নিচে কিছু best practices দেওয়া হল, যেগুলি RegExp কোড লেখার সময় মাথায় রাখা উচিত।
১. RegExp এর প্যাটার্ন সহজ ও পরিষ্কার রাখুন
জটিল প্যাটার্নের পরিবর্তে, সহজ ও পরিষ্কার প্যাটার্ন ব্যবহার করুন, যাতে অন্য ডেভেলপাররা সহজেই বুঝতে পারে। কমপ্লেক্স প্যাটার্নগুলোকে ভাগ করে ছোট ছোট অংশে বিভক্ত করা উচিত।
ভাল উদাহরণ:
let regex = /^[a-zA-Z0-9]+$/;
এটি স্ট্রিংয়ের মধ্যে শুধুমাত্র অক্ষর (letters) এবং সংখ্যা (digits) থাকতে হবে, প্যাটার্নটি সহজ ও পরিষ্কার।
খারাপ উদাহরণ:
let regex = /^[^!@#$%^&*()_+={}\[\]|\\";:<>,.?/~`]+$/;
এখানে প্যাটার্নটি অত্যন্ত জটিল এবং পরবর্তী সময়ে এটি বুঝতে অনেক কঠিন হবে। এমন প্যাটার্নের পরিবর্তে সাধারণ প্যাটার্ন ব্যবহার করা উচিত।
২. শিরোনাম/নামযুক্ত ক্যাপচার গ্রুপ ব্যবহার করুন
RegExp এর ক্যাপচার গ্রুপগুলির জন্য একটি নাম দেয়া উচিত। এটি কোডের পঠনযোগ্যতা বাড়ায় এবং এই গ্রুপগুলির উদ্দেশ্য পরিষ্কার করে তোলে। নামযুক্ত ক্যাপচার গ্রুপের জন্য (?<name>pattern) সিনট্যাক্স ব্যবহার করা হয়।
ভাল উদাহরণ:
let regex = /(?<areaCode>\d{3})-(?<exchangeCode>\d{3})-(?<subscriberNumber>\d{4})/;
let match = regex.exec("123-456-7890");
console.log(match.groups.areaCode); // 123
এখানে, নামযুক্ত ক্যাপচার গ্রুপ ব্যবহার করা হয়েছে, যার মাধ্যমে আমরা সহজে নির্দিষ্ট অংশটি বের করতে পারছি, এবং এটি আরও পঠনযোগ্য।
খারাপ উদাহরণ:
let regex = /^(\d{3})-(\d{3})-(\d{4})$/;
let match = regex.exec("123-456-7890");
console.log(match[1]); // 123
এখানে গ্রুপগুলোর কোনো নাম নেই, ফলে কোড বুঝতে এবং বজায় রাখতে সমস্যা হতে পারে।
৩. RegExp প্যাটার্নে মন্তব্য যোগ করুন
যখন প্যাটার্নটি জটিল হয়, তখন RegExp প্যাটার্নের মধ্যে মন্তব্য যোগ করা গুরুত্বপূর্ণ। JavaScript RegExp এ x ফ্ল্যাগ (extended mode) ব্যবহার করে প্যাটার্নে স্পেস এবং মন্তব্য যুক্ত করা যেতে পারে।
let regex = /^(?:\d{3}) # area code
-\d{3} # exchange code
-\d{4}$/u # subscriber number
এখানে, RegExp প্যাটার্নের বিভিন্ন অংশে মন্তব্য করা হয়েছে, যার মাধ্যমে অন্য ডেভেলপাররা সহজেই বুঝতে পারবেন প্যাটার্নটি কীভাবে কাজ করছে।
৪. গ্লোবাল ফ্ল্যাগ (g) এবং মাল্টি-লাইন ফ্ল্যাগ (m) ব্যবহার সতর্কভাবে
যখন g (গ্লোবাল) এবং m (মাল্টি-লাইন) ফ্ল্যাগ ব্যবহার করেন, তখন সাবধান থাকুন, কারণ এগুলি প্যাটার্নের আচরণ পরিবর্তন করতে পারে এবং কখনও কখনও অবাঞ্ছিত ফলাফল হতে পারে। এগুলি শুধুমাত্র তখন ব্যবহার করুন যখন তা প্রয়োজনীয়।
ভাল উদাহরণ:
let regex = /\d+/g;
let str = "There are 123 apples and 456 bananas.";
let numbers = str.match(regex);
console.log(numbers); // ["123", "456"]
এখানে, g ফ্ল্যাগ ব্যবহার করা হয়েছে, যাতে স্ট্রিংয়ের সব সংখ্যাগুলি পাওয়া যায়।
খারাপ উদাহরণ:
let regex = /^abc/m;
let str = "abc\nabc";
console.log(regex.test(str)); // true
এখানে m ফ্ল্যাগ ব্যবহার করা হয়েছে যা ভুলভাবে স্ট্রিংয়ের সমস্ত লাইনকে পরীক্ষা করবে। এই ধরনের ব্যবহার থেকে বিরত থাকা উচিত।
৫. RegExp এর জন্য ডিবাগging এবং টেস্টিং টুল ব্যবহার করুন
যখন RegExp প্যাটার্ন লিখছেন, তখন একটি ডিবাগিং বা টেস্টিং টুল ব্যবহার করা গুরুত্বপূর্ণ, যাতে আপনি প্যাটার্নটির আচরণ দ্রুত পরীক্ষা এবং নিশ্চিত করতে পারেন। Regex101 এর মতো টুলে আপনি আপনার RegExp প্যাটার্ন পরীক্ষা এবং ডিবাগ করতে পারেন।
৬. RegExp প্যাটার্নের পুনরাবৃত্তি এড়িয়ে চলুন
একই প্যাটার্ন বা অংশের জন্য পুনরাবৃত্তি করা খারাপ প্র্যাকটিস। প্যাটার্নটির পুনরাবৃত্তি কমানোর জন্য আপনি backreferences বা named groups ব্যবহার করতে পারেন।
ভাল উদাহরণ:
let regex = /^(?<username>[a-zA-Z0-9]+)@(?<domain>[a-zA-Z0-9]+\.[a-zA-Z]+)$/;
let match = regex.exec("user@example.com");
console.log(match.groups.username); // user
এখানে, আমরা একটি নামকৃত গ্রুপ ব্যবহার করেছি, যা পুনরাবৃত্তির পরিবর্তে আরও পরিষ্কার কোড প্রদান করে।
৭. নির্দিষ্ট ক্ষেত্রে সঠিক ফ্ল্যাগ ব্যবহার করুন
i: যদি আপনি বড় হাতের ও ছোট হাতের অক্ষরের মধ্যে পার্থক্য না করতে চান, তবেiফ্ল্যাগ ব্যবহার করুন।g: যদি আপনি স্ট্রিংয়ে প্যাটার্নটির সমস্ত উপস্থিতি খুঁজতে চান, তবেgফ্ল্যাগ ব্যবহার করুন।m: যদি আপনি মাল্টি-লাইন স্ট্রিংয়ে প্যাটার্ন খুঁজতে চান, তবেmফ্ল্যাগ ব্যবহার করুন।
সারাংশ
RegExp ব্যবহার করার সময় readability এবং maintainability বজায় রাখা অত্যন্ত গুরুত্বপূর্ণ। প্যাটার্ন সহজ, পরিষ্কার এবং সুনির্দিষ্ট রাখুন, গ্রুপগুলির জন্য নাম ব্যবহার করুন, মন্তব্য যোগ করুন, এবং প্রয়োজনে ডিবাগিং টুল ব্যবহার করুন। এই best practices অনুসরণ করলে আপনার RegExp কোড আরও পরিষ্কার, সংক্ষিপ্ত, এবং সহজে রক্ষণাবেক্ষণযোগ্য হবে।
RegExp (Regular Expressions) জটিল এবং বৃহৎ স্কেল অ্যাপ্লিকেশনগুলিতে খুবই কার্যকরী হতে পারে, তবে এটি সঠিকভাবে ব্যবহারের জন্য কিছু বিশেষ কৌশল প্রয়োজন। যখন আপনার কাজের মধ্যে অনেক ডেটা বা জটিল প্যাটার্নের প্রয়োজন হয়, তখন RegExp-কে দক্ষভাবে ব্যবহার করা গুরুত্বপূর্ণ। এর ফলে পারফরম্যান্স ও maintainability বজায় রাখা যায়।
Complex Patterns তৈরি করা
জটিল RegExp প্যাটার্নগুলি সাধারণত বিশাল ডেটাসেট বা বিশেষ স্ট্রিং সন্নিবেশিত হতে পারে, যার জন্য ভালোভাবে ডিজাইন করা RegExp প্রয়োজন। Complex patterns তৈরি করার সময় কিছু গুরুত্বপূর্ণ বিষয় মাথায় রাখতে হয়।
1. Grouping and Capturing
Grouping (গ্রুপিং) এবং capturing (ক্যাপচারিং) প্যাটার্নের মধ্যে অংশগুলিকে আলাদা করার জন্য ব্যবহৃত হয়। এভাবে আপনি একটি স্ট্রিংয়ের ভিন্ন ভিন্ন অংশ বের করতে পারেন।
- Grouping: এটি বিভিন্ন অংশকে একটি গ্রুপের মধ্যে রাখতে সাহায্য করে। যেমন:
()। - Capturing Groups: এই গ্রুপগুলির মাধ্যমে আপনি মেলানো অংশগুলো পৃথকভাবে ধরে রাখতে পারেন। যেমন:
/(abc)(\d+)/।
উদাহরণ:
let regex = /(\d+)-(\d+)-(\d+)/;
let str = "2023-12-16";
let matches = regex.exec(str);
console.log(matches); // ["2023-12-16", "2023", "12", "16"]
এখানে, capturing groups ((\d+)) স্ট্রিংয়ের অংশগুলো আলাদা করে ধরে রেখেছে।
2. Lookahead এবং Lookbehind Assertions
Lookahead এবং Lookbehind assertions ব্যবহার করা হয় এমন প্যাটার্ন তৈরি করতে যা কোনও নির্দিষ্ট শর্ত পূরণ করে কিন্তু তা অংশ হিসেবে ধরবে না।
- Positive Lookahead:
(?=...)— যদি একটি শর্ত পূর্ণ হয় তবে মিলাবে। - Negative Lookahead:
(?!...)— যদি একটি শর্ত পূর্ণ না হয় তবে মিলাবে। - Positive Lookbehind:
(?<=...)— মিলের আগে একটি শর্ত পূর্ণ হলে। - Negative Lookbehind:
(?<!...)— মিলের আগে একটি শর্ত পূর্ণ না হলে।
উদাহরণ:
let regex = /\d+(?=\s+days)/; // Matches numbers followed by " days"
let str = "3 days, 5 days, and 12 days";
let matches = str.match(regex);
console.log(matches); // ["3", "5", "12"]
এখানে, positive lookahead (?=\s+days) ব্যবহার করা হয়েছে যা শুধুমাত্র সেগুলি মিলাবে যেগুলোর পরবর্তী অংশে days থাকে।
3. Non-Capturing Groups
যখন আপনি একটি গ্রুপ তৈরি করতে চান কিন্তু ঐ অংশটি ক্যাপচার করতে চান না, তখন non-capturing groups ব্যবহার করতে পারেন। এটি পারফরম্যান্স উন্নত করতে সাহায্য করে।
উদাহরণ:
let regex = /(?:abc)+/; // Non-capturing group
let str = "abcabcabc";
console.log(regex.test(str)); // true
এখানে, (?:abc) একটি non-capturing group যা শুধু মিলের জন্য কাজ করবে, কিন্তু কোন গ্রুপের ফলাফল হিসেবে ক্যাপচার হবে না।
Large Scale Applications এ RegExp এর ব্যবহার
বৃহৎ স্কেল অ্যাপ্লিকেশনগুলোতে, যেখানে বিশাল ডেটাসেট এবং জটিল প্যাটার্ন প্রয়োজন, RegExp-এর ব্যবহারে কিছু সতর্কতা অবলম্বন করা প্রয়োজন যাতে পারফরম্যান্স নষ্ট না হয়।
1. RegExp Performance Optimization
বৃহৎ ডেটা বা সিস্টেমে RegExp ব্যবহার করার সময় পারফরম্যান্স একটি গুরুত্বপূর্ণ বিষয়। RegExp-এর সঠিক ব্যবহার না করলে এটি catastrophic backtracking এবং high complexity তৈরি করতে পারে, যা অ্যাপ্লিকেশনের পারফরম্যান্স কমিয়ে দিতে পারে।
- Avoiding Greedy Quantifiers: বেশি জটিল greedy quantifiers যেমন
.*ব্যবহার এড়ানো উচিত, কারণ এটি খোঁজার সময় অনেক পিছনে ফিরে যেতে পারে। - Anchoring Patterns: প্যাটার্নে anchors (
^এবং$) ব্যবহার করলে RegExp দ্রুততার সাথে মিল খুঁজে পাবে, কারণ এটি শুরু এবং শেষ স্পষ্ট করে দেয়।
উদাহরণ:
let regex = /^abc.*xyz$/; // Anchored pattern
let str = "abc123xyz";
console.log(regex.test(str)); // true
এখানে, ^abc স্ট্রিংয়ের শুরুতে মিল খুঁজছে এবং xyz$ স্ট্রিংয়ের শেষে মিল খুঁজছে, যা পারফরম্যান্সে সহায়ক।
2. Pre-compiling RegExp
RegExp যদি বারবার একই প্যাটার্নের সাথে কাজ করে, তবে pre-compiling (পূর্বপ্রস্তুত করা) RegExp ভাল পারফরম্যান্স দেয়। এটি RegExp constructor এর মাধ্যমে করা যায়, যাতে প্যাটার্ন একবার কম্পাইল হয় এবং পরে শুধুমাত্র স্ট্রিংয়ের সাথে ম্যাচ করা হয়।
উদাহরণ:
let regex = new RegExp("abc", "g");
let str = "abc abc abc";
let result = regex.exec(str);
console.log(result); // ["abc"]
এখানে, new RegExp() ব্যবহার করা হয়েছে, যা একটি কম্পাইলড প্যাটার্ন প্রদান করবে এবং পরবর্তী ম্যাচিং অপারেশন দ্রুততর হবে।
3. Handling Dynamic Input Data
বৃহৎ অ্যাপ্লিকেশনে ডাইনামিক ইনপুটের জন্য RegExp ব্যবহার করার সময় আপনাকে সতর্ক থাকতে হবে। যদি ইনপুট ডেটা পরিবর্তনশীল হয়, তবে আপনাকে input validation এবং escape sequences সঠিকভাবে ব্যবহার করতে হবে।
উদাহরণ:
let userInput = "abc*";
let regex = new RegExp(userInput);
let str = "abc*";
console.log(regex.test(str)); // true
এখানে, dynamic input থেকে RegExp তৈরি করা হচ্ছে, তাই ইনপুটের মধ্যে বিশেষ চরিত্র বা escape sequences (যেমন *, . ইত্যাদি) সঠিকভাবে ব্যবহৃত না হলে ভুল হতে পারে।
4. Batch Processing for Large Datasets
যখন বৃহৎ ডেটাসেট নিয়ে কাজ করা হয়, তখন batch processing ব্যবহার করা হয়, যেখানে ডেটার ছোট ছোট অংশে RegExp প্রয়োগ করা হয়। এটি একবারে বড় ডেটার উপর RegExp চালানোর চেয়ে অনেক বেশি কার্যকর হতে পারে।
উদাহরণ:
let data = ["abc", "123", "xyz", "abc123"];
let regex = /abc/;
let results = data.filter(item => regex.test(item));
console.log(results); // ["abc", "abc123"]
এখানে, batch processing ব্যবহার করা হয়েছে যেখানে data অ্যারের প্রতিটি উপাদানকে পৃথকভাবে পরীক্ষা করা হয়েছে।
সারাংশ
RegExp এর সাহায্যে জটিল প্যাটার্ন তৈরি করা এবং বৃহৎ স্কেল অ্যাপ্লিকেশনগুলিতে এটি ব্যবহার করা অনেক বেশি কার্যকরী হতে পারে, তবে সঠিক কৌশল অনুসরণ করা আবশ্যক। Grouping, capturing, lookahead/lookbehind, এবং non-capturing groups ব্যবহার করা হয় প্যাটার্নগুলিকে আরো শক্তিশালী এবং দক্ষ করতে। এছাড়াও, RegExp performance optimization, pre-compiling, dynamic input handling, এবং batch processing এর মতো কৌশলগুলি RegExp এর কার্যক্ষমতা উন্নত করতে সহায়তা করে, বিশেষত বৃহৎ ডেটাসেট এবং জটিল অ্যাপ্লিকেশনগুলিতে।
RegExp (রেগুলার এক্সপ্রেশন) এর শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে Named Groups এবং Lookaheads/Lookbehinds অন্যতম। এই দুটি বৈশিষ্ট্য একসাথে ব্যবহার করে আরও জটিল এবং লজিক্যাল প্যাটার্ন তৈরি করা সম্ভব। চলুন, এই দুটি বৈশিষ্ট্যের বিস্তারিত আলোচনা করি এবং কিভাবে একসাথে ব্যবহার করা যায় তা দেখব।
Named Groups
Named Groups রেগুলার এক্সপ্রেশনগুলিতে গ্রুপিংয়ের জন্য একটি পদ্ধতি যা আপনাকে গ্রুপের জন্য একটি নাম দিতে সাহায্য করে। এটি রেগুলার এক্সপ্রেশনটির মেলানো অংশগুলিকে আরও স্পষ্টভাবে চিহ্নিত করতে সহায়ক, যাতে কোডের মধ্যে সেই অংশগুলোকে সহজে রেফারেন্স করা যায়।
নতুন RegExp সিমেন্টিক্সে ?<> সাইন ব্যবহার করে নামযুক্ত গ্রুপ তৈরি করা যায়। এটি ঐ অংশকে একটি নাম দেয়, যা পরবর্তীতে ম্যাচ করার পর ঐ গ্রুপের মান বের করার জন্য ব্যবহার করা যায়।
Named Groups এর সিনট্যাক্স
/(?<name>pattern)/
এখানে, name হল গ্রুপের নাম এবং pattern হল সেই অংশের প্যাটার্ন যা ম্যাচ করবে।
উদাহরণ:
let regex = /(?<username>\w+)@(?<domain>\w+\.\w+)/;
let str = "user@example.com";
let match = str.match(regex);
console.log(match.groups.username); // "user"
console.log(match.groups.domain); // "example.com"
এখানে, (?<username>\w+) গ্রুপটি username কে চিহ্নিত করে এবং (?<domain>\w+\.\w+) গ্রুপটি domain এর মান বের করে।
Lookaheads এবং Lookbehinds
Lookahead এবং Lookbehind রেগুলার এক্সপ্রেশনের বিশেষ ধরনের গ্রুপিং যা "শর্তযুক্ত" ম্যাচিংয়ের জন্য ব্যবহৃত হয়। এগুলি নিশ্চিত করতে সাহায্য করে যে, কোন প্যাটার্ন একটি নির্দিষ্ট শর্ত পূরণ করলে ম্যাচ হবে, তবে সেই শর্ত নিজে কখনোই রেজাল্টে অন্তর্ভুক্ত হয় না।
১. Positive Lookahead (?=)
Positive Lookahead নিশ্চিত করে যে, প্যাটার্নের পরবর্তী অংশটি একটি নির্দিষ্ট শর্ত পূরণ করবে।
/foo(?=bar)/
এটি "foo" কে ম্যাচ করবে যদি তার পর "bar" থাকে, তবে "bar" অংশটি ম্যাচে অন্তর্ভুক্ত হবে না।
২. Negative Lookahead (?!)
Negative Lookahead নিশ্চিত করে যে, প্যাটার্নের পরবর্তী অংশটি একটি নির্দিষ্ট শর্ত পূরণ করবে না।
foo(?!bar)
এটি "foo" কে ম্যাচ করবে যদি তার পর "bar" না থাকে।
৩. Positive Lookbehind (?<=)
Positive Lookbehind নিশ্চিত করে যে, প্যাটার্নের পূর্ববর্তী অংশটি একটি নির্দিষ্ট শর্ত পূরণ করবে।
/(?<=@)\w+/
এটি "@" এর পরবর্তী অংশকে ম্যাচ করবে, যেমন "example" যদি email address "user@example.com" থেকে "@example" পরবর্তী শব্দ বের করতে হয়।
৪. Negative Lookbehind (?<!)
Negative Lookbehind নিশ্চিত করে যে, প্যাটার্নের পূর্ববর্তী অংশটি একটি নির্দিষ্ট শর্ত পূরণ করবে না।
/(?<!@)\w+/
এটি "@" এর পূর্ববর্তী অংশ ছাড়া যেকোনো শব্দকে ম্যাচ করবে, যেমন "user" যদি email address "user@example.com" এর "@example.com" অংশ বাদ দেয়া হয়।
Named Groups এবং Lookaheads/Lookbehinds এর সমন্বয়
Named Groups এবং Lookaheads/Lookbehinds একসাথে ব্যবহার করলে আপনি আরও নির্দিষ্ট এবং শক্তিশালী প্যাটার্ন তৈরি করতে পারেন। এই দুটি বৈশিষ্ট্য একত্রে ব্যবহার করে এমন প্যাটার্ন তৈরি করা যেতে পারে যা নির্দিষ্ট শর্ত পূরণ করার সাথে সাথে বিভিন্ন গ্রুপের মান বের করে।
উদাহরণ: Lookahead এবং Named Group
ধরা যাক, আমরা এমন একটি RegExp তৈরি করতে চাই যা একটি email ঠিকানার username বের করবে, তবে এটি নিশ্চিত করবে যে ডোমেইনটি "example.com" এর সমতুল্য।
let regex = /(?<username>\w+)(?=@example\.com)/;
let str = "user@example.com";
let match = str.match(regex);
console.log(match.groups.username); // "user"
এখানে, (?<username>\w+) অংশটি username গ্রুপের জন্য এবং (?=@example\.com) অংশটি positive lookahead, যা নিশ্চিত করে যে username এর পর "@example.com" রয়েছে।
উদাহরণ: Lookbehind এবং Named Group
এখন ধরুন, আমরা একটি RegExp তৈরি করতে চাই যা একটি স্ট্রিং থেকে সঠিক মুদ্রার মান বের করবে, তবে শুধুমাত্র যদি এটি "USD" মুদ্রা কোডের পর থাকে।
let regex = /(?<=USD\s)(?<amount>\d+\.\d{2})/;
let str = "The price is USD 49.99";
let match = str.match(regex);
console.log(match.groups.amount); // "49.99"
এখানে, (?<=USD\s) অংশটি positive lookbehind, যা নিশ্চিত করে যে "USD " পূর্ববর্তী অংশে রয়েছে এবং (?<amount>\d+\.\d{2}) অংশটি named group যার মাধ্যমে আমরা মূল্য বের করছি।
সারাংশ
Named Groups এবং Lookaheads/Lookbehinds RegExp-এ দুটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য যা একসাথে ব্যবহার করে আপনি আরও জটিল এবং শর্তসাপেক্ষ প্যাটার্ন তৈরি করতে পারেন। Named Groups ব্যবহার করে গ্রুপের নাম নির্ধারণ করে সহজে মান বের করতে পারেন, এবং Lookahead/Lookbehind এর মাধ্যমে শর্ত নির্ধারণ করতে পারেন যে একটি প্যাটার্ন কোথায় মেলে বা না মেলে। এই দুটি বৈশিষ্ট্য একত্রে ব্যবহৃত হলে, জটিল টেক্সট প্রসেসিং কার্যক্রম অনেক সহজ হয়ে যায়।
Read more