রেগুলার এক্সপ্রেশনের র্যান্ডম নয়েজের মতো দেখতে হওয়ার খ্যাতি আছে। ^[\w.-]+@[\w-]+\.\w{2,}$-এর মতো একটি প্যাটার্ন মনে হতে পারে বিড়াল কীবোর্ডের উপর দিয়ে হেঁটে গেছে। কিন্তু এই রহস্যময় সিনট্যাক্সের পিছনে রয়েছে একটি অসাধারণ মার্জিত ধারণা: টেক্সটে প্যাটার্ন বর্ণনা করার একটি সংক্ষিপ্ত ভাষা।
আপনি ফর্ম ইনপুট ভ্যালিডেট করছেন, লগ ফাইল সার্চ করছেন, ডেটা পরিষ্কার করছেন, বা একটি কোডবেস জুড়ে ফাইন্ড-অ্যান্ড-রিপ্লেস করছেন, regex একজন ডেভেলপারের টুলকিটের সবচেয়ে বহুমুখী টুলগুলোর একটি। এবং প্রকৃত মূল্য পেতে আপনাকে প্রতিটি অস্পষ্ট বৈশিষ্ট্য মুখস্থ করতে হবে না। মুষ্টিমেয় বিল্ডিং ব্লক ব্যবহারিক ব্যবহারের বেশিরভাগ কেস কভার করে।
Regex আসলে কী করে
একটি রেগুলার এক্সপ্রেশন (regex বা regexp) হলো একটি প্যাটার্ন যা স্ট্রিংগুলোর একটি সেট বর্ণনা করে। আপনি এটি একটি সার্চ ইঞ্জিনকে দেন — আপনার প্রোগ্রামিং ভাষা, টেক্সট এডিটর, বা কমান্ড-লাইন টুলে — এবং এটি মেলে এমন প্রতিটি স্ট্রিং খুঁজে বের করে।
এটিকে একটি আপগ্রেডেড সার্চ কুয়েরি হিসাবে ভাবুন:
- সাধারণ সার্চ: "error" শব্দটি হুবহু খুঁজুন
- Regex সার্চ: যেকোনো কিছু খুঁজুন যা দেখতে IP ঠিকানা, তারিখ, ইমেইল ঠিকানা বা আপনি বর্ণনা করতে পারেন এমন যেকোনো কাঠামোর মতো
Regex গণিতবিদ Stephen Kleene ১৯৫৬ সালে আবিষ্কার করেছিলেন এবং ১৯৬০-এর দশকে Unix টেক্সট এডিটরের মাধ্যমে কম্পিউটিংয়ে প্রবেশ করেছিল। আজ এটি কার্যত প্রতিটি প্রোগ্রামিং ভাষা এবং টেক্সট এডিটরে সমর্থিত।
বিল্ডিং ব্লক
লিটারেল ক্যারেক্টার
সবচেয়ে সরল regex হলো প্লেইন টেক্সট। hello প্যাটার্ন যেখানেই দেখা যাক "hello" স্ট্রিংটির সাথে মেলে। কোনো জটিলতা নেই।
ডট (.) — যেকোনো ক্যারেক্টার
একটি ডট নিউলাইন ছাড়া যেকোনো একক ক্যারেক্টারের সাথে মেলে।
h.tমেলে "hat", "hit", "hot", "h3t", এমনকি "h t"
ক্যারেক্টার ক্লাস ([])
বর্গাকার বন্ধনী একটি অবস্থানে অনুমোদিত ক্যারেক্টারের একটি সেট নির্ধারণ করে।
[aeiou]— যেকোনো স্বরবর্ণ[0-9]— যেকোনো ডিজিট[A-Za-z]— যেকোনো অক্ষর[^0-9]— যেকোনো ক্যারেক্টার যা ডিজিট নয় (বন্ধনীর ভিতরে^মানে "নয়")
শর্টহ্যান্ড ক্লাস
| শর্টহ্যান্ড | অর্থ | সমতুল্য |
|---|---|---|
\d |
যেকোনো ডিজিট | [0-9] |
\w |
ওয়ার্ড ক্যারেক্টার | [A-Za-z0-9_] |
\s |
হোয়াইটস্পেস | [ \t\n\r] |
\D |
ডিজিট নয় | [^0-9] |
\W |
ওয়ার্ড ক্যারেক্টার নয় | [^A-Za-z0-9_] |
\S |
হোয়াইটস্পেস নয় | [^ \t\n\r] |
কোয়ান্টিফায়ার — কতগুলো
কোয়ান্টিফায়ার নিয়ন্ত্রণ করে পূর্ববর্তী উপাদানটি কতবার দেখা যেতে হবে।
| প্রতীক | অর্থ | উদাহরণ | মেলে |
|---|---|---|---|
* |
শূন্য বা তার বেশি | ab*c |
"ac", "abc", "abbc" |
+ |
এক বা তার বেশি | ab+c |
"abc", "abbc" ("ac" নয়) |
? |
শূন্য বা এক | colou?r |
"color" এবং "colour" |
{3} |
ঠিক ৩ | \d{3} |
"123", "456" |
{2,4} |
২ থেকে ৪ এর মধ্যে | \d{2,4} |
"12", "123", "1234" |
অ্যাঙ্কর — অবস্থান
^— স্ট্রিংয়ের শুরু (অথবা লাইনের,mফ্ল্যাগ সহ)$— স্ট্রিংয়ের শেষ (অথবা লাইনের)\b— শব্দ সীমানা
^\d{4}$ প্যাটার্নটি এমন স্ট্রিংয়ের সাথে মেলে যা ঠিক চারটি ডিজিট, যেমন "2026", কিন্তু "abc2026" বা "2026xyz" নয়।
গ্রুপ এবং অল্টারনেশন
(abc)— "abc" কে একটি গ্রুপ হিসাবে ক্যাপচার করেa|b— "a" অথবা "b" এর সাথে মেলে(cat|dog)— "cat" অথবা "dog" এর সাথে মেলে
গ্রুপ আপনাকে সিকোয়েন্সে কোয়ান্টিফায়ার প্রয়োগ করতে দেয়: (ha)+ মেলে "ha", "haha", "hahaha"।
সাধারণ ব্যবহারিক প্যাটার্ন
ইমেইল ভ্যালিডেট করা (মৌলিক)
^[\w.-]+@[\w-]+\.\w{2,}$
এটি user@example.com, first.last@company.co.uk (আংশিকভাবে) এর সাথে মেলে এবং @ বা ডোমেইন ছাড়া স্ট্রিং প্রত্যাখ্যান করে।
গুরুত্বপূর্ণ: Regex দিয়ে ইমেইল ঠিকানা নিখুঁতভাবে ভ্যালিডেট করা কুখ্যাতভাবে কঠিন — পূর্ণ RFC 5322 স্পেসিফিকেশন অত্যন্ত জটিল। প্রোডাকশন সিস্টেমের জন্য, ফরম্যাট চেকিংয়ের জন্য একটি মৌলিক regex ব্যবহার করুন এবং তারপর একটি নিশ্চিতকরণ ইমেইল পাঠিয়ে ঠিকানা যাচাই করুন।
ফোন নম্বর মেলানো
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{3,4}[-.\s]?\d{3,4}
এটি +1 555 123 4567, 555-123-4567, এবং (555) 123-4567-এর মতো ফরম্যাট হ্যান্ডেল করে।
URL মেলানো
https?://[\w.-]+(/[\w./?&=-]*)?
মেলে https://example.com, http://example.com/path?q=hello।
তারিখ মেলানো (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
মেলে 2026-03-29, 1999-12-31। দ্রষ্টব্য: এটি শুধু ফরম্যাট পরীক্ষা করে, বৈধতা নয় — এটি 9999-99-99-ও মেলাবে।
আচরণ পরিবর্তনকারী ফ্ল্যাগ
বেশিরভাগ regex ইঞ্জিন ফ্ল্যাগ সমর্থন করে যা প্যাটার্ন প্রয়োগের পদ্ধতি পরিবর্তন করে:
| ফ্ল্যাগ | নাম | প্রভাব |
|---|---|---|
g |
Global | শুধু প্রথমটি নয়, সব ম্যাচ খুঁজুন |
i |
Case-insensitive | hello মেলে "Hello", "HELLO", ইত্যাদি |
m |
Multiline | ^ এবং $ প্রতিটি লাইনের শুরু/শেষে মেলে |
s |
Dotall | . নিউলাইন ক্যারেক্টারের সাথেও মেলে |
JavaScript-এ, ক্লোজিং স্ল্যাশের পরে ফ্ল্যাগ যোগ করা হয়: /hello/gi। Python-এ, আর্গুমেন্ট হিসাবে পাস করা হয়: re.findall(r"hello", text, re.IGNORECASE)।
যখন Regex অতিরিক্ত
Regex শক্তিশালী, কিন্তু সবসময় সঠিক টুল নয়:
- HTML বা XML পার্স করা। একটি সঠিক DOM পার্সার ব্যবহার করুন। Regex নির্ভরযোগ্যভাবে নেস্টেড ট্যাগ হ্যান্ডেল করতে পারে না।
- JSON পার্স করা।
JSON.parse()বা সমতুল্য ব্যবহার করুন। এজ কেসে regex ভেঙে যাবে। - জটিল ভ্যালিডেশন। যদি আপনার প্যাটার্ন একাধিক লাইনে বিস্তৃত এবং পড়তে পাঁচ মিনিট লাগে, পরিবর্তে প্রোসিজারাল ভ্যালিডেশন কোড লেখার কথা ভাবুন।
- সহজ স্ট্রিং অপারেশন। যদি আপনার শুধু
startsWith(),includes(), বাsplit()দরকার, প্লেইন স্ট্রিং মেথড স্পষ্ট এবং দ্রুত।
সাধারণ সমস্যা
- বিশেষ ক্যারেক্টার এস্কেপ করতে ভুলে যাওয়া। ডট
.যেকোনো ক্যারেক্টারের সাথে মেলে। আক্ষরিক ডট মেলাতে\.ব্যবহার করুন।(,),[,],+,*,?,{,},^,$,|, এবং\-এর জন্যও একই। - গ্রিডি বনাম লেজি ম্যাচিং। ডিফল্টভাবে,
.*গ্রিডি — এটি যতটা সম্ভব মেলে। লেজি করতে?যোগ করুন:.*?যতটা সম্ভব কম মেলে। ডেলিমিটারের মধ্যে কন্টেন্ট বের করার সময় এটি গুরুত্বপূর্ণ। - ক্যাটাস্ট্রফিক ব্যাকট্র্যাকিং।
(a+)+-এর মতো নেস্টেড কোয়ান্টিফায়ার নির্দিষ্ট ইনপুটে ইঞ্জিনকে এক্সপোনেনশিয়াল সংখ্যক পথ চেষ্টা করাতে পারে, আপনার প্রোগ্রাম ফ্রিজ করে দিয়ে। ওভারল্যাপিং প্যাটার্নে নেস্টেড রিপিটিশন এড়িয়ে চলুন। - অ্যাঙ্কর ভুলে যাওয়া।
^এবং$ছাড়া, আপনার প্যাটার্ন সাবস্ট্রিংয়ের সাথে মেলে।\d{3}"abc12345"-এর ভিতরে "123" মেলে। সুনির্দিষ্ট ম্যাচ চাইলে^\d{3}$ব্যবহার করুন।
আরও জানুন
Regex শেখার সেরা উপায় হলো পরীক্ষা-নিরীক্ষা করা। একটি প্যাটার্ন টাইপ করুন, কিছু টেস্ট টেক্সট পেস্ট করুন এবং কী হাইলাইট হয় দেখুন। প্রতিটি অংশ কীভাবে কাজ করে তা না বোঝা পর্যন্ত সামঞ্জস্য করুন এবং পুনরাবৃত্তি করুন।
- কীভাবে Regex প্যাটার্ন টেস্ট করবেন — উদাহরণসহ ইন্টারঅ্যাক্টিভ টিউটোরিয়াল
- Regex Tester — আপনার প্যাটার্ন এবং টেস্ট ডেটা পেস্ট করুন, রিয়েল টাইমে ম্যাচ হাইলাইটেড দেখুন
