রেগুলার এক্সপ্রেশন ব্যবহার করে জাভাস্ক্রিপ্টের উন্নত প্যাটার্ন ম্যাচিং অন্বেষণ করুন। দক্ষ কোডের জন্য regex সিনট্যাক্স, ব্যবহারিক প্রয়োগ এবং অপ্টিমাইজেশন কৌশল শিখুন।
জাভাস্ক্রিপ্টে রেগুলার এক্সপ্রেশন দিয়ে প্যাটার্ন ম্যাচিং: একটি বিস্তারিত নির্দেশিকা
রেগুলার এক্সপ্রেশন (regex) জাভাস্ক্রিপ্টে প্যাটার্ন ম্যাচিং এবং টেক্সট ম্যানিপুলেশনের জন্য একটি শক্তিশালী টুল। এটি ডেভেলপারদের নির্দিষ্ট প্যাটার্নের উপর ভিত্তি করে স্ট্রিং সার্চ, যাচাই এবং রূপান্তর করতে সাহায্য করে। এই নির্দেশিকাটিতে জাভাস্ক্রিপ্টে রেগুলার এক্সপ্রেশনের একটি বিস্তারিত বিবরণ দেওয়া হয়েছে, যেখানে সিনট্যাক্স, ব্যবহার এবং উন্নত কৌশল আলোচনা করা হয়েছে।
রেগুলার এক্সপ্রেশন কী?
রেগুলার এক্সপ্রেশন হলো অক্ষরের একটি ক্রম যা একটি সার্চ প্যাটার্ন নির্ধারণ করে। এই প্যাটার্নগুলো স্ট্রিং মেলানো এবং ম্যানিপুলেট করার জন্য ব্যবহৃত হয়। প্রোগ্রামিং-এ রেগুলার এক্সপ্রেশন ব্যাপকভাবে ব্যবহৃত হয়, যেমন:
- ডেটা ভ্যালিডেশন: ব্যবহারকারীর ইনপুট নির্দিষ্ট ফরম্যাট মেনে চলছে কিনা তা নিশ্চিত করা (যেমন, ইমেল অ্যাড্রেস, ফোন নম্বর)।
- ডেটা এক্সট্র্যাকশন: টেক্সট থেকে নির্দিষ্ট তথ্য বের করা (যেমন, তারিখ, ইউআরএল বা মূল্য)।
- সার্চ এবং রিপ্লেস: জটিল প্যাটার্নের উপর ভিত্তি করে টেক্সট খুঁজে বের করা এবং প্রতিস্থাপন করা।
- টেক্সট প্রসেসিং: নির্দিষ্ট নিয়মের উপর ভিত্তি করে স্ট্রিং বিভক্ত করা, যুক্ত করা বা রূপান্তর করা।
জাভাস্ক্রিপ্টে রেগুলার এক্সপ্রেশন তৈরি করা
জাভাস্ক্রিপ্টে রেগুলার এক্সপ্রেশন দুইভাবে তৈরি করা যায়:
- রেগুলার এক্সপ্রেশন লিটারেল ব্যবহার করে: প্যাটার্নটিকে ফরওয়ার্ড স্ল্যাশের (
/) মধ্যে রাখা হয়। RegExpকনস্ট্রাক্টর ব্যবহার করে: প্যাটার্নটিকে স্ট্রিং হিসেবে দিয়ে একটিRegExpঅবজেক্ট তৈরি করা হয়।
উদাহরণ:
// রেগুলার এক্সপ্রেশন লিটারেল ব্যবহার করে
const regexLiteral = /hello/;
// RegExp কনস্ট্রাক্টর ব্যবহার করে
const regexConstructor = new RegExp("hello");
দুটি পদ্ধতির মধ্যে কোনটি বেছে নেওয়া হবে তা নির্ভর করে প্যাটার্নটি কম্পাইলের সময় জানা আছে নাকি ডাইনামিকভাবে তৈরি হয়েছে তার উপর। যখন প্যাটার্নটি নির্দিষ্ট এবং আগে থেকে জানা থাকে, তখন লিটারেল নোটেশন ব্যবহার করুন। যখন প্যাটার্নটি প্রোগ্রাম্যাটিকভাবে তৈরি করার প্রয়োজন হয়, বিশেষ করে যখন ভেরিয়েবল অন্তর্ভুক্ত থাকে, তখন কনস্ট্রাক্টর ব্যবহার করুন।
বেসিক Regex সিনট্যাক্স
রেগুলার এক্সপ্রেশন এমন অক্ষর নিয়ে গঠিত যা মেলানোর জন্য প্যাটার্নকে উপস্থাপন করে। এখানে কিছু মৌলিক regex উপাদান রয়েছে:
- লিটারেল ক্যারেক্টার: অক্ষরগুলোকে সরাসরি ম্যাচ করে (যেমন,
/a/অক্ষর 'a' কে ম্যাচ করে)। - মেটক্যারেক্টার: এগুলোর বিশেষ অর্থ রয়েছে (যেমন,
.,^,$,*,+,?,[],{},(),\,|)। - ক্যারেক্টার ক্লাস: অক্ষরের সেট বোঝায় (যেমন,
[abc]অক্ষর 'a', 'b', বা 'c' এর সাথে মেলে)। - কোয়ান্টিফায়ার: একটি অক্ষর বা গ্রুপ কতবার আসবে তা নির্দিষ্ট করে (যেমন,
*,+,?,{n},{n,},{n,m})। - অ্যাঙ্কর: স্ট্রিং-এর অবস্থান ম্যাচ করে (যেমন,
^শুরু এবং$শেষ ম্যাচ করে)।
সাধারণ মেটক্যারেক্টার:
.(ডট): নিউলাইন ছাড়া যেকোনো একটি অক্ষর ম্যাচ করে।^(ক্যারেট): স্ট্রিং-এর শুরু ম্যাচ করে।$(ডলার): স্ট্রিং-এর শেষ ম্যাচ করে।*(অ্যাস্টেরিস্ক): পূর্ববর্তী অক্ষর বা গ্রুপের শূন্য বা তার বেশি সংখ্যক পুনরাবৃত্তি ম্যাচ করে।+(প্লাস): পূর্ববর্তী অক্ষর বা গ্রুপের এক বা তার বেশি সংখ্যক পুনরাবৃত্তি ম্যাচ করে।?(প্রশ্নবোধক চিহ্ন): পূর্ববর্তী অক্ষর বা গ্রুপের শূন্য বা একটি পুনরাবৃত্তি ম্যাচ করে। এটি ঐচ্ছিক অক্ষরের জন্য ব্যবহৃত হয়।[](স্কয়ার ব্র্যাকেট): একটি ক্যারেক্টার ক্লাস নির্ধারণ করে, যা ব্র্যাকেটের মধ্যে থাকা যেকোনো একটি অক্ষর ম্যাচ করে।{}(কার্লি ব্রেস): কতবার ম্যাচ করতে হবে তা নির্দিষ্ট করে।{n}ঠিক n বার ম্যাচ করে,{n,}n বা তার বেশি বার ম্যাচ করে,{n,m}n থেকে m বারের মধ্যে ম্যাচ করে।()(প্যারেন্থেসিস): অক্ষরগুলোকে একসাথে গ্রুপ করে এবং ম্যাচ হওয়া সাবস্ট্রিং ক্যাপচার করে।\(ব্যাকস্ল্যাশ): মেটক্যারেক্টারগুলোকে এস্কেপ করে, যাতে আপনি সেগুলোকে লিটারেলি ম্যাচ করতে পারেন।|(পাইপ): "অথবা" অপারেটর হিসেবে কাজ করে, এর আগের বা পরের এক্সপ্রেশনের সাথে ম্যাচ করে।
ক্যারেক্টার ক্লাস:
[abc]: a, b, বা c অক্ষরের যেকোনো একটির সাথে মেলে।[^abc]: a, b, বা c ছাড়া যেকোনো অক্ষরের সাথে মেলে।[a-z]: a থেকে z পর্যন্ত যেকোনো ছোট হাতের অক্ষরের সাথে মেলে।[A-Z]: A থেকে Z পর্যন্ত যেকোনো বড় হাতের অক্ষরের সাথে মেলে।[0-9]: 0 থেকে 9 পর্যন্ত যেকোনো ডিজিটের সাথে মেলে।[a-zA-Z0-9]: যেকোনো আলফানিউমেরিক অক্ষরের সাথে মেলে।\d: যেকোনো ডিজিটের সাথে মেলে ([0-9]এর সমতুল্য)।\D: যেকোনো নন-ডিজিট অক্ষরের সাথে মেলে ([^0-9]এর সমতুল্য)।\w: যেকোনো শব্দ অক্ষরের সাথে মেলে (আলফানিউমেরিক এবং আন্ডারস্কোর;[a-zA-Z0-9_]এর সমতুল্য)।\W: যেকোনো নন-ওয়ার্ড অক্ষরের সাথে মেলে ([^a-zA-Z0-9_]এর সমতুল্য)।\s: যেকোনো হোয়াইটস্পেস অক্ষরের সাথে মেলে (স্পেস, ট্যাব, নিউলাইন, ইত্যাদি)।\S: যেকোনো নন-হোয়াইটস্পেস অক্ষরের সাথে মেলে।
কোয়ান্টিফায়ার:
*: পূর্ববর্তী উপাদানটি শূন্য বা তার বেশি বার ম্যাচ করে। উদাহরণস্বরূপ,a*"", "a", "aa", "aaa" ইত্যাদির সাথে মেলে।+: পূর্ববর্তী উপাদানটি এক বা তার বেশি বার ম্যাচ করে। উদাহরণস্বরূপ,a+"a", "aa", "aaa" এর সাথে মেলে, কিন্তু "" এর সাথে নয়।?: পূর্ববর্তী উপাদানটি শূন্য বা একবার ম্যাচ করে। উদাহরণস্বরূপ,a?"" বা "a" এর সাথে মেলে।{n}: পূর্ববর্তী উপাদানটি ঠিক *n* বার ম্যাচ করে। উদাহরণস্বরূপ,a{3}"aaa" এর সাথে মেলে।{n,}: পূর্ববর্তী উপাদানটি *n* বা তার বেশি বার ম্যাচ করে। উদাহরণস্বরূপ,a{2,}"aa", "aaa", "aaaa" ইত্যাদির সাথে মেলে।{n,m}: পূর্ববর্তী উপাদানটি *n* এবং *m* বারের মধ্যে (অন্তর্ভুক্ত) ম্যাচ করে। উদাহরণস্বরূপ,a{2,4}"aa", "aaa", বা "aaaa" এর সাথে মেলে।
অ্যাঙ্কর:
^: স্ট্রিং-এর শুরু ম্যাচ করে। উদাহরণস্বরূপ,^Helloসেইসব স্ট্রিং-এর সাথে মেলে যা "Hello" দিয়ে *শুরু* হয়।$: স্ট্রিং-এর শেষ ম্যাচ করে। উদাহরণস্বরূপ,World$সেইসব স্ট্রিং-এর সাথে মেলে যা "World" দিয়ে *শেষ* হয়।\b: একটি শব্দ সীমানা (word boundary) ম্যাচ করে। এটি একটি শব্দ অক্ষর (\w) এবং একটি নন-ওয়ার্ড অক্ষর (\W) এর মধ্যবর্তী অবস্থান অথবা স্ট্রিং-এর শুরু বা শেষের অবস্থান। উদাহরণস্বরূপ,\bword\bসম্পূর্ণ "word" শব্দটি ম্যাচ করে।
ফ্ল্যাগ:
Regex ফ্ল্যাগ রেগুলার এক্সপ্রেশনের আচরণ পরিবর্তন করে। এগুলি regex লিটারেলের শেষে যোগ করা হয় বা RegExp কনস্ট্রাক্টরের দ্বিতীয় আর্গুমেন্ট হিসেবে পাস করা হয়।
g(গ্লোবাল): প্যাটার্নের সমস্ত পুনরাবৃত্তি ম্যাচ করে, শুধু প্রথমটি নয়।i(ইগনোর কেস): কেস-ইনসেনসিটিভ ম্যাচিং করে।m(মাল্টিলাইন): মাল্টিলাইন মোড সক্রিয় করে, যেখানে^এবং$প্রতিটি লাইনের শুরু এবং শেষ ম্যাচ করে (\nদ্বারা বিভক্ত)।s(ডটঅল): ডট (.)-কে নিউলাইন অক্ষর ম্যাচ করার অনুমতি দেয়।u(ইউনিকোড): সম্পূর্ণ ইউনিকোড সমর্থন সক্রিয় করে।y(স্টিকি): শুধুমাত্র regex-এরlastIndexপ্রপার্টি দ্বারা নির্দেশিত সূচক থেকে ম্যাচ করে।
জাভাস্ক্রিপ্ট Regex মেথড
জাভাস্ক্রিপ্ট রেগুলার এক্সপ্রেশনের সাথে কাজ করার জন্য বেশ কিছু মেথড সরবরাহ করে:
test(): একটি স্ট্রিং প্যাটার্নের সাথে মেলে কিনা তা পরীক্ষা করে।trueবাfalseরিটার্ন করে।exec(): একটি স্ট্রিং-এ ম্যাচ খোঁজার জন্য এক্সিকিউট করে। ম্যাচ হওয়া টেক্সট এবং ক্যাপচার করা গ্রুপ সহ একটি অ্যারে রিটার্ন করে, অথবা কোনো ম্যাচ না পাওয়া গেলেnullরিটার্ন করে।match(): একটি রেগুলার এক্সপ্রেশনের বিপরীতে একটি স্ট্রিং ম্যাচ করার ফলাফল সহ একটি অ্যারে রিটার্ন করে।gফ্ল্যাগ সহ এবং ছাড়া এর আচরণ ভিন্ন হয়।search(): একটি স্ট্রিং-এ ম্যাচ পরীক্ষা করে। প্রথম ম্যাচের ইনডেক্স রিটার্ন করে, অথবা কোনো ম্যাচ না পাওয়া গেলে -1 রিটার্ন করে।replace(): একটি প্যাটার্নের পুনরাবৃত্তিগুলোকে একটি প্রতিস্থাপনকারী স্ট্রিং বা একটি ফাংশন যা প্রতিস্থাপনকারী স্ট্রিং রিটার্ন করে, তা দিয়ে প্রতিস্থাপন করে।split(): একটি রেগুলার এক্সপ্রেশনের উপর ভিত্তি করে একটি স্ট্রিংকে সাবস্ট্রিং-এর অ্যারেতে বিভক্ত করে।
Regex মেথড ব্যবহারের উদাহরণ:
// test()
const regex = /hello/;
const str = "hello world";
console.log(regex.test(str)); // আউটপুট: true
// exec()
const regex2 = /hello (\w+)/;
const str2 = "hello world";
const result = regex2.exec(str2);
console.log(result); // আউটপুট: ["hello world", "world", index: 0, input: "hello world", groups: undefined]
// 'g' ফ্ল্যাগ সহ match()
const regex3 = /\d+/g; // বিশ্বব্যাপী এক বা একাধিক সংখ্যা ম্যাচ করে
const str3 = "There are 123 apples and 456 oranges.";
const matches = str3.match(regex3);
console.log(matches); // আউটপুট: ["123", "456"]
// 'g' ফ্ল্যাগ ছাড়া match()
const regex4 = /\d+/;
const str4 = "There are 123 apples and 456 oranges.";
const match = str4.match(regex4);
console.log(match); // আউটপুট: ["123", index: 11, input: "There are 123 apples and 456 oranges.", groups: undefined]
// search()
const regex5 = /world/;
const str5 = "hello world";
console.log(str5.search(regex5)); // আউটপুট: 6
// replace()
const regex6 = /world/;
const str6 = "hello world";
const newStr = str6.replace(regex6, "JavaScript");
console.log(newStr); // আউটপুট: hello JavaScript
// একটি ফাংশন সহ replace()
const regex7 = /(\d+)-(\d+)-(\d+)/;
const str7 = "Today's date is 2023-10-27";
const newStr2 = str7.replace(regex7, (match, year, month, day) => {
return `${day}/${month}/${year}`;
});
console.log(newStr2); // আউটপুট: Today's date is 27/10/2023
// split()
const regex8 = /, /;
const str8 = "apple, banana, cherry";
const arr = str8.split(regex8);
console.log(arr); // আউটপুট: ["apple", "banana", "cherry"]
অ্যাডভান্সড Regex কৌশল
ক্যাপচারিং গ্রুপ:
প্যারেন্থেসিস () রেগুলার এক্সপ্রেশনে ক্যাপচারিং গ্রুপ তৈরি করতে ব্যবহৃত হয়। ক্যাপচার করা গ্রুপগুলো আপনাকে ম্যাচ হওয়া টেক্সটের নির্দিষ্ট অংশগুলো বের করতে সাহায্য করে। exec() এবং match() মেথড একটি অ্যারে রিটার্ন করে যেখানে প্রথম উপাদানটি হল সম্পূর্ণ ম্যাচ, এবং পরবর্তী উপাদানগুলো হল ক্যাপচার করা গ্রুপ।
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const dateString = "2023-10-27";
const match = regex.exec(dateString);
console.log(match[0]); // আউটপুট: 2023-10-27 (সম্পূর্ণ ম্যাচ)
console.log(match[1]); // আউটপুট: 2023 (প্রথম ক্যাপচার করা গ্রুপ - বছর)
console.log(match[2]); // আউটপুট: 10 (দ্বিতীয় ক্যাপচার করা গ্রুপ - মাস)
console.log(match[3]); // আউটপুট: 27 (তৃতীয় ক্যাপচার করা গ্রুপ - দিন)
নেমড ক্যাপচারিং গ্রুপ:
ES2018-এ নেমড ক্যাপচারিং গ্রুপ চালু করা হয়েছে, যা আপনাকে (? সিনট্যাক্স ব্যবহার করে ক্যাপচারিং গ্রুপগুলোকে নাম দেওয়ার অনুমতি দেয়। এটি কোডকে আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
const regex = /(?\d{4})-(?\d{2})-(?\d{2})/;
const dateString = "2023-10-27";
const match = regex.exec(dateString);
console.log(match.groups.year); // আউটপুট: 2023
console.log(match.groups.month); // আউটপুট: 10
console.log(match.groups.day); // আউটপুট: 27
নন-ক্যাপচারিং গ্রুপ:
যদি আপনার একটি regex-এর অংশগুলোকে ক্যাপচার না করে গ্রুপ করার প্রয়োজন হয় (যেমন, একটি গ্রুপের উপর কোয়ান্টিফায়ার প্রয়োগ করার জন্য), আপনি (?:...) সিনট্যাক্স ব্যবহার করে একটি নন-ক্যাপচারিং গ্রুপ ব্যবহার করতে পারেন। এটি ক্যাপচার করা গ্রুপগুলোর জন্য অপ্রয়োজনীয় মেমরি বরাদ্দ এড়াতে সাহায্য করে।
const regex = /(?:https?:\/\/)?([\w\.]+)/; // একটি URL ম্যাচ করে কিন্তু শুধুমাত্র ডোমেন নাম ক্যাপচার করে
const url = "https://www.example.com/path";
const match = regex.exec(url);
console.log(match[1]); // আউটপুট: www.example.com
লুকঅ্যারাউন্ড:
লুকঅ্যারাউন্ড হলো জিরো-উইডথ অ্যাসারশন যা একটি স্ট্রিং-এর মধ্যে একটি অবস্থানকে ম্যাচ করে, যা সেই অবস্থানের আগে (লুকবিহাইন্ড) বা পরে (লুকএহেড) থাকা একটি প্যাটার্নের উপর ভিত্তি করে কাজ করে, কিন্তু লুকঅ্যারাউন্ড প্যাটার্নটি নিজে ম্যাচের অংশ হয় না।
- পজিটিভ লুকএহেড:
(?=...)যদি বর্তমান অবস্থানের *পরে* লুকএহেডের ভেতরের প্যাটার্নটি থাকে তাহলে ম্যাচ করে। - নেগেটিভ লুকএহেড:
(?!...)যদি বর্তমান অবস্থানের *পরে* লুকএহেডের ভেতরের প্যাটার্নটি না থাকে তাহলে ম্যাচ করে। - পজিটিভ লুকবিহাইন্ড:
(?<=...)যদি বর্তমান অবস্থানের *আগে* লুকবিহাইন্ডের ভেতরের প্যাটার্নটি থাকে তাহলে ম্যাচ করে। - নেগেটিভ লুকবিহাইন্ড:
(? যদি বর্তমান অবস্থানের *আগে* লুকবিহাইন্ডের ভেতরের প্যাটার্নটি না থাকে তাহলে ম্যাচ করে।
উদাহরণ:
// পজিটিভ লুকএহেড: শুধুমাত্র যখন USD দ্বারা অনুসরণ করা হয় তখন মূল্যটি পান
const regex = /\d+(?= USD)/;
const text = "The price is 100 USD";
const match = text.match(regex);
console.log(match); // আউটপুট: ["100"]
// নেগেটিভ লুকএহেড: শুধুমাত্র যখন একটি সংখ্যা দ্বারা অনুসরণ করা না হয় তখন শব্দটি পান
const regex2 = /\b\w+\b(?! \d)/;
const text2 = "apple 123 banana orange 456";
const matches = text2.match(regex2);
console.log(matches); // আউটপুট: null কারণ match() 'g' ফ্ল্যাগ ছাড়া শুধুমাত্র প্রথম ম্যাচটি রিটার্ন করে, যা আমাদের প্রয়োজন নয়।
// এটি ঠিক করতে:
const regex3 = /\b\w+\b(?! \d)/g;
const text3 = "apple 123 banana orange 456";
const matches3 = text3.match(regex3);
console.log(matches3); // আউটপুট: [ 'banana' ]
// পজিটিভ লুকবিহাইন্ড: শুধুমাত্র যখন $ দ্বারা পূর্বে থাকে তখন মানটি পান
const regex4 = /(?<=L\$)\d+/;
const text4 = "The price is $200";
const match4 = text4.match(regex4);
console.log(match4); // আউটপুট: ["200"]
// নেগেটিভ লুকবিহাইন্ড: শুধুমাত্র যখন 'not' শব্দটি দ্বারা পূর্বে না থাকে তখন শব্দটি পান
const regex5 = /(?
ব্যাকরেফারেন্স:
ব্যাকরেফারেন্স আপনাকে একই রেগুলার এক্সপ্রেশনের মধ্যে পূর্বে ক্যাপচার করা গ্রুপগুলোকে রেফার করতে দেয়। তারা \1, \2, ইত্যাদি সিনট্যাক্স ব্যবহার করে, যেখানে সংখ্যাটি ক্যাপচার করা গ্রুপের সংখ্যার সাথে মিলে যায়।
const regex = /([a-z]+) \1/;
const text = "hello hello world";
const match = regex.exec(text);
console.log(match); // আউটপুট: ["hello hello", "hello", index: 0, input: "hello hello world", groups: undefined]
রেগুলার এক্সপ্রেশনের ব্যবহারিক প্রয়োগ
ইমেল ঠিকানা যাচাইকরণ:
রেগুলার এক্সপ্রেশনের একটি সাধারণ ব্যবহার হল ইমেল ঠিকানা যাচাই করা। যদিও একটি নিখুঁত ইমেল যাচাইকরণ regex অত্যন্ত জটিল, এখানে একটি সরলীকৃত উদাহরণ দেওয়া হল:
const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
console.log(emailRegex.test("test@example.com")); // আউটপুট: true
console.log(emailRegex.test("invalid-email")); // আউটপুট: false
console.log(emailRegex.test("test@sub.example.co.uk")); // আউটপুট: true
টেক্সট থেকে ইউআরএল বের করা:
আপনি একটি টেক্সট ব্লক থেকে ইউআরএল বের করতে রেগুলার এক্সপ্রেশন ব্যবহার করতে পারেন:
const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g;
const text = "Visit our website at https://www.example.com or check out http://blog.example.org.";
const urls = text.match(urlRegex);
console.log(urls); // আউটপুট: ["https://www.example.com", "http://blog.example.org"]
CSV ডেটা পার্সিং:
CSV (কমা-সেপারেটেড ভ্যালুস) ডেটা পার্স করতে রেগুলার এক্সপ্রেশন ব্যবহার করা যেতে পারে। এখানে একটি CSV স্ট্রিংকে মানগুলির একটি অ্যারেতে বিভক্ত করার একটি উদাহরণ রয়েছে, যা কোটেড ফিল্ড পরিচালনা করে:
const csvString = 'John,Doe,"123, Main St",New York';
const csvRegex = /(?:"([^"]*(?:""[^"]*)*)")|([^,]+)/g; //সংশোধিত CSV regex
let values = [];
let match;
while (match = csvRegex.exec(csvString)) {
values.push(match[1] ? match[1].replace(/""/g, '"') : match[2]);
}
console.log(values); // আউটপুট: ["John", "Doe", "123, Main St", "New York"]
আন্তর্জাতিক ফোন নম্বর যাচাইকরণ
আন্তর্জাতিক ফোন নম্বর যাচাই করা জটিল কারণ এর বিভিন্ন ফরম্যাট এবং দৈর্ঘ্য রয়েছে। একটি শক্তিশালী সমাধানের জন্য প্রায়শই একটি লাইব্রেরি ব্যবহার করা হয়, তবে একটি সরলীকৃত regex প্রাথমিক যাচাইকরণ প্রদান করতে পারে:
const phoneRegex = /^\+(?:[0-9] ?){6,14}[0-9]$/;
console.log(phoneRegex.test("+1 555 123 4567")); // আউটপুট: true (US উদাহরণ)
console.log(phoneRegex.test("+44 20 7946 0500")); // আউটপুট: true (UK উদাহরণ)
console.log(phoneRegex.test("+81 3 3224 5000")); // আউটপুট: true (জাপান উদাহরণ)
console.log(phoneRegex.test("123-456-7890")); // আউটপুট: false
পাসওয়ার্ডের শক্তি যাচাইকরণ
পাসওয়ার্ডের শক্তি নীতি প্রয়োগের জন্য রেগুলার এক্সপ্রেশন কার্যকর। নীচের উদাহরণটি ন্যূনতম দৈর্ঘ্য, বড় হাতের অক্ষর, ছোট হাতের অক্ষর এবং একটি সংখ্যার জন্য পরীক্ষা করে।
const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/;
console.log(passwordRegex.test("P@ssword123")); // আউটপুট: true
console.log(passwordRegex.test("password")); // আউটপুট: false (কোনো বড় হাতের অক্ষর বা সংখ্যা নেই)
console.log(passwordRegex.test("Password")); // আউটপুট: false (কোনো সংখ্যা নেই)
console.log(passwordRegex.test("Pass123")); // আউটপুট: false (কোনো ছোট হাতের অক্ষর নেই)
console.log(passwordRegex.test("P@ss1")); // আউটপুট: false (৮ অক্ষরের কম)
Regex অপ্টিমাইজেশন কৌশল
রেগুলার এক্সপ্রেশন কম্পিউটেশনালি ব্যয়বহুল হতে পারে, বিশেষ করে জটিল প্যাটার্ন বা বড় ইনপুটের জন্য। এখানে regex পারফরম্যান্স অপ্টিমাইজ করার কিছু কৌশল রয়েছে:
- নির্দিষ্ট হোন: অতিরিক্ত সাধারণ প্যাটার্ন ব্যবহার করা থেকে বিরত থাকুন যা উদ্দেশ্যের চেয়ে বেশি ম্যাচ করতে পারে।
- অ্যাঙ্কর ব্যবহার করুন: যখনই সম্ভব স্ট্রিং-এর শুরুতে বা শেষে regex অ্যাঙ্কর করুন (
^,$)। - ব্যাকট্র্যাকিং এড়িয়ে চলুন: প্রয়োজনে পোসেসিভ কোয়ান্টিফায়ার (যেমন,
+এর পরিবর্তে++) বা অ্যাটমিক গ্রুপ ((?>...)) ব্যবহার করে ব্যাকট্র্যাকিং কমান। - একবার কম্পাইল করুন: যদি আপনি একই regex একাধিকবার ব্যবহার করেন, তবে এটি একবার কম্পাইল করুন এবং
RegExpঅবজেক্টটি পুনরায় ব্যবহার করুন। - ক্যারেক্টার ক্লাস বুদ্ধিমত্তার সাথে ব্যবহার করুন: ক্যারেক্টার ক্লাস (
[]) সাধারণত অল্টারনেশন (|) এর চেয়ে দ্রুত হয়। - সরল রাখুন: অতিরিক্ত জটিল regex এড়িয়ে চলুন যা বোঝা এবং রক্ষণাবেক্ষণ করা কঠিন। কখনও কখনও, একটি জটিল কাজকে একাধিক সহজ regex-এ ভেঙে দেওয়া বা অন্যান্য স্ট্রিং ম্যানিপুলেশন কৌশল ব্যবহার করা আরও কার্যকর হতে পারে।
সাধারণ Regex ভুল
- মেটক্যারেক্টার এস্কেপ করতে ভুলে যাওয়া: যখন আপনি
.,*,+,?,$,^,(,),[,],{,},|, এবং\এর মতো বিশেষ অক্ষরগুলোকে লিটারেলি ম্যাচ করতে চান, তখন সেগুলোকে এস্কেপ করতে ব্যর্থ হওয়া। .(ডট) এর অতিরিক্ত ব্যবহার: ডট যেকোনো অক্ষর ম্যাচ করে (কিছু মোডে নিউলাইন ছাড়া), যা সাবধানে ব্যবহার না করলে অপ্রত্যাশিত ম্যাচ হতে পারে। সম্ভব হলে ক্যারেক্টার ক্লাস বা অন্যান্য সীমাবদ্ধ প্যাটার্ন ব্যবহার করে আরও নির্দিষ্ট হোন।- লোভ (Greediness): ডিফল্টরূপে,
*এবং+এর মতো কোয়ান্টিফায়ারগুলো লোভী হয় এবং যতটা সম্ভব ম্যাচ করবে। যখন আপনার সবচেয়ে ছোট সম্ভাব্য স্ট্রিং ম্যাচ করার প্রয়োজন হয়, তখন লেজি কোয়ান্টিফায়ার (*?,+?) ব্যবহার করুন। - অ্যাঙ্করের ভুল ব্যবহার:
^(স্ট্রিং/লাইনের শুরু) এবং$(স্ট্রিং/লাইনের শেষ) এর আচরণ ভুল বোঝা ভুল ম্যাচের কারণ হতে পারে। মাল্টিলাইন স্ট্রিং নিয়ে কাজ করার সময় এবং^এবং$দিয়ে প্রতিটি লাইনের শুরু এবং শেষ ম্যাচ করতে চাইলেm(মাল্টিলাইন) ফ্ল্যাগ ব্যবহার করতে মনে রাখবেন। - এজ কেস উপেক্ষা করা: সমস্ত সম্ভাব্য ইনপুট পরিস্থিতি এবং এজ কেস বিবেচনা করতে ব্যর্থ হলে বাগ হতে পারে। আপনার regex গুলোকে বিভিন্ন ধরনের ইনপুট, যেমন খালি স্ট্রিং, অবৈধ অক্ষর এবং বাউন্ডারি কন্ডিশন দিয়ে পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন।
- পারফরম্যান্স সমস্যা: অতিরিক্ত জটিল এবং অদক্ষ regex তৈরি করলে পারফরম্যান্স সমস্যা হতে পারে, বিশেষ করে বড় ইনপুটের সাথে। আরও নির্দিষ্ট প্যাটার্ন ব্যবহার করে, অপ্রয়োজনীয় ব্যাকট্র্যাকিং এড়িয়ে এবং বারবার ব্যবহৃত regex কম্পাইল করে আপনার regex অপ্টিমাইজ করুন।
- ক্যারেক্টার এনকোডিং উপেক্ষা করা: ক্যারেক্টার এনকোডিং (বিশেষ করে ইউনিকোড) সঠিকভাবে পরিচালনা না করলে অপ্রত্যাশিত ফলাফল হতে পারে। ইউনিকোড অক্ষরের সাথে কাজ করার সময় সঠিক ম্যাচিং নিশ্চিত করতে
uফ্ল্যাগ ব্যবহার করুন।
উপসংহার
রেগুলার এক্সপ্রেশন জাভাস্ক্রিপ্টে প্যাটার্ন ম্যাচিং এবং টেক্সট ম্যানিপুলেশনের জন্য একটি মূল্যবান টুল। regex সিনট্যাক্স এবং কৌশল আয়ত্ত করা আপনাকে ডেটা যাচাইকরণ থেকে শুরু করে জটিল টেক্সট প্রসেসিং পর্যন্ত বিস্তৃত সমস্যা দক্ষতার সাথে সমাধান করতে সাহায্য করে। এই নির্দেশিকায় আলোচিত ধারণাগুলো বোঝার মাধ্যমে এবং বাস্তব-বিশ্বের উদাহরণ দিয়ে অনুশীলন করার মাধ্যমে, আপনি আপনার জাভাস্ক্রিপ্ট ডেভেলপমেন্ট দক্ষতা বাড়াতে রেগুলার এক্সপ্রেশন ব্যবহারে পারদর্শী হতে পারেন।
মনে রাখবেন যে রেগুলার এক্সপ্রেশন জটিল হতে পারে, এবং regex101.com বা regexr.com এর মতো অনলাইন regex টেস্টার ব্যবহার করে সেগুলোকে পুঙ্খানুপুঙ্খভাবে পরীক্ষা করা প্রায়শই সহায়ক। এটি আপনাকে ম্যাচগুলো কল্পনা করতে এবং যেকোনো সমস্যা কার্যকরভাবে ডিবাগ করতে দেয়। হ্যাপি কোডিং!