রেগুলার এক্সপ্রেশন (প্রথম কিস্তি )

রেগুলার এক্সপ্রেশন(Regular Expression) হল এমন একটা এক্সপ্রেশন যা ব্যবহার করে আমরা কোন স্ট্রিং(String) থেকে যা খুঁজছি সেটা বের করে আনতে পারি ।

যেমন ধরেন , "/shajal/" একটা রেগুলার এক্সপ্রেশন । এইটা ব্যবহার করে আমরা "shajal goes to school" এর মাঝে "shajal" শব্দটি আছে কিনা আর থাকলেও কোথায় ,কত বার আছে এগুলো সব বের করতে পারব ।

উপরের উদাহরণটি আসলে রেগুলার এক্সপ্রেশনের খুব সহজ একটা উদাহরণ । সব রেগুলার এক্সপ্রেশন এত সহজ হয় না । তাহলে কেমন হয় সেগুলো ? চলুন একটু দেখার চেষ্টা করি ।

একটা রেগুলার এক্সপ্রেশনে দুই ধরনের ক্যারেক্টার থাকতে পারে ।

  • লিটারেল ক্যারেক্টার (Literal Character)
  • মেটা ক্যারেক্টার (Meta Character)

লিটারেল ক্যারেক্টারঃ

আমাদের উপরের উদাহরণের ক্ষেত্রে "/shajal/" রেগুলার এক্সপ্রেশনটির প্রতিটি ক্যারেক্টার হল এক একটি লিটারেল ক্যারেক্টার । এখন আমরা একটু অন্যভাবে চিন্তা করি । ধরলাম “shajal” হল একটা বাক্স । তার বাম এবং ডান পাশে দুইটা পাইপ আছে ।

Regex: /shajal/

এই বাক্সটা অনেকটা মেটাল ডিটেক্টরের মত কাজ করে । মেটাল ডিটেক্ট করতে পারে এরকম কোন বাক্সের মধ্যে দিয়ে আমরা যদি কোন মেটাল নিয়ে যাই তাহলে সেটি আমাদের সিগনাল দিয়ে জানান দিয়ে যে এর মধ্যে মেটাল জাতীয় কিছু আছে । ঠিক তেমন করেই আমরা যদি “shajal goes to school” স্ট্রিংকে উপরের বাক্সের মধ্য দিয়ে প্রবেশ করাই তাহলে বক্সটি আমাদের বলবে এই স্ট্রিং এর মাঝে “shajal” শব্দটি আছে কিনা ।

আমরা এই বাক্সের বাম পাশের পাইপ দিয়ে স্ট্রিং এর শব্দ গুলো এক এক করে ইনপুট দিতে থাকব । যেই শব্দটার জন্য আমরা বাম পাশের পাইপ থেকে বাক্সের মধ্যে দিয়ে ডান পাশের পাইপে যেতে পারব সেই শব্দটাই আমরা খুঁজছি । এখানে “shajal goes to school” স্ট্রিং এর “goes” “to” “school”কোনটি জন্য আমরা বাক্সের বাম পাশ থেকে ডান পাশে যেতে পার না । শুধুমাত্র “shajal”এর জন্য পারব ।

মেটা ক্যারেক্টারঃ

এখন যদি আমাদের রেগুলার এক্সপ্রেশনটা এভাবে লিখি “/^shajal/” । তাহলে ছবিটা হবে এরকম

Regex: /^shajal/

এর মানে হল “shajal” স্ট্রিংকে অবশ্যই লাইনের প্রথমে হতে হবে । তারমানে আমাদের ইনপুট স্ট্রিং যদি “shajal goes to school ” এটা হয় তাহলে এই রেগুলার এক্সপ্রেশন দিয়ে “shajal” কে খুঁজে পাওয়া যাবে । কিন্তু “zerin and shajal go to school” এই ইনপুট স্ট্রিং এর জন্য “shajal” কে খুঁজে পাওয়া যাবেনা কারণ “shajal” লাইনের প্রথমে নেই । এখানে “^” হল মেটা ক্যারেক্টার

রেগুলার এক্সপ্রেশন আসলে প্যাটার্ন ম্যাচিং মেশিন বানানোর একটা উপায় । আমরা এক্সপ্রেশন বা রুলটা লেখি আর সেই অনুযায়ী মেশিন তৈরি হয় । তারপর সেই মেশিন মধ্যে দিয়ে আমরা আমাদের স্ট্রিং ইনপুট দিলে মেশিন একসেপ্ট (accept)করে অথবা রিজেক্ট(reject) করে । প্যাটার্ন পেয়ে গেলে একসেপ্ট করে ,না পেলে রিজেক্ট ।

এরকম আরো কিছু মেটা ক্যারেক্টার আছে ।

.    যেকোন ক্যারেক্টার একবার থাকলেই হল। 
Regex: /./

(a,b,…..,z,A,B…..,Z,0,1…9,-,……. etc)যেটাই দেই এই মেশিন সেটা একসেপ্ট করবে । তারমানে আপনি যেকোন ক্যারেক্টার ইনপুট দিয়ে বাক্সের বাম পাশ থেকে ডান পাশে যেতে পারবেন ।

\d    0 থেকে শুরু করে 9 পর্যন্ত যেকোন ডিজিট। 
Regex: /\d/

মেশিন এর ভিতর দিয়ে (0–9) এর মধ্যে যেকোন ডিজিট ইনপুট দিলেই সেই ডিজিটকে একসেপ্ট করবে।

\w    (a-z,A-Z,0-9) এই ক্যারেক্টারগুলো দিয়ে গঠিত যেকোন শব্দ
Regex: /\w/

এই মেশিন এর ভিতর দিয়ে (a-z,A-Z,0–9) ক্যারেক্টারগুলো দিয়ে গঠিত যেকোন শব্দ (word) ইনপুট দিলেই একসেপ্ট করবে।

বাকি গুলো আপনারা চিন্তা করে বের করতে পারবেন । তাই আমি আর কথা না বাড়াই ।

\W    \w এর ঠিক উল্টা । (a-z,A-Z,0-9) এই ক্যারেক্টারগুলো ছাড়া গঠিত যেকোন শব্দ।
Regex: /\W/
\s    যেকোন whitespace ক্যারেক্টার।
Regex: /\s/
\S    \s এর ঠিক উল্টা
Regex: /\S/

পজিশন মেটা ক্যারেক্টারঃ

এগুলো সাধারণত উপরের মেটা ক্যারেক্টারগুলোর সাথে ব্যবহার করা হয় ।

^     লাইনের শুরু বোঝাতে 

উদাহরণঃ /^shajal/

Regex: /^shajal/

এক্ষেত্রে "" শব্দটা লাইনের প্রথমে হতে হবে। তাহলে ইনপুট স্ট্রিংকে একসেপ্ট করবে ।

$     লাইনের শেষ বোঝাতে 

উদাহরণঃ /shajal$/

Regex: /shajal$/

এই মেশিনটা সেই সকল স্ট্রিংকেই একসেপ্ট করে যাদের শেষ শব্দটি "shajal"

\b     যেকোন ওয়ার্ড এর বাউন্ডারি বোঝাতে 

উদাহরণঃ /\bcat/

Regex: /\bcat/

/\bcat/ এক্সপ্রেশনটি শুধু সেই সকল শব্দকে(word) একসেপ্ট করে যাদের শুরু হয় "cat" দিয়ে।যেমনঃ catatonic , catfish

উদাহরণঃ /cat\b/

Regex: /cat\b/

/\bcat/ এক্সপ্রেশনটি শুধু সেই সকল শব্দকে(word) একসেপ্ট করে যাদের শেষ হয় “cat” দিয়ে।যেমনঃ tomcat

উদাহরণঃ /\bcat\b/

Regex: /\bcat\b/

এইটা কি হবে আপনারাই চিন্তা করে নিন ।

কোয়ান্টিফায়ারঃ

এগুলো সাধারণত ক্যারেক্টারগুলোর পরে বসে সেগুলোর কাজ কর্ম পরিবর্তন করে দেয় । কোয়ান্টিফাই মানে হল পরিমাণ বলে দেয়া । তার মানে কোন কিছু কতবার হবে বা তার পরিমাণ কতটুকু সেটা বলে দেয়া ।

?     এর আগের ক্যারেক্টারটি একবার থাকলেও হবে অথবা না থাকলেও হবে। 

উদাহরণঃ /sa?/

ছবি দেখলেই বোঝা যাচ্ছে যে , ক্যারেক্টারটি একবার থাকলেও আমরা বাম পাশ থেকে ডান পাশে যেতে পারব অর্থাৎ মেশিন একসেপ্ট করবে । একবার না থাকলেও পারব । কিন্তু “s” ক্যারেক্টারটি অবশ্যই থাকতে হবে ।

*       এর আগের ক্যারেক্টারটি অসংখ্যবার থাকলেও হবে অথবা না থাকলেও হবে।

উদাহরণঃ /sa*/

এই মেশিনটি "" এর পরে "" না থাকলেও অথবা যতবার খুশি ততবার থাকলেও একসেপ্ট করবে ।

+         এর আগের ক্যারেক্টারটি অসংখ্যবার থাকলেও হবে অথবা অন্তত একবার থাকতে হবে।

উদাহরণঃ /sa+/

Regex: /sa+/
{min,max}   এর আগের ক্যারেক্টারটি সর্বনিম্ন min এবং সর্বোচ্চ max সংখ্যকবার থাকতে পারবে

উদাহরণঃ /sa{2,3}/

এখানে {2,3} এর আগের ক্যারেক্টার “a” সর্বনিম্ন 2 এবং সর্বোচ্চ 3 সংখ্যকবার থাকতে পারবে ।

ক্যারেক্টার ক্লাস

এই ধরনের রেগুলার এক্সপ্রেশনগুলোকে ক্যারেক্টার ক্লাস বলা হয় । এখানে প্রতিটা ক্যারেক্টারের মাঝে or রিলেশন আছে । অর্থাৎ শব্দগুলোর মাঝের যেকোন একটা ক্যারেক্টার

এর সাথে

অল্টারনেশন

“|” এই মেটা ক্যারেক্টারেটি or হিসাবে কাজ করে । যেমন আমি যদি “color” অথবা “colour” এই দুইটা শব্দ ইনপুট স্ট্রিং থেকে রেগুলার এক্সপ্রেশন ব্যবহার করে খুঁজে বের করতে চাই তাহলে সেক্ষেত্রে এক্সপ্রেশনটি হবে /color|colour/ । একে অল্টারনেশন বলে ।

Regex: /color|colour/

তারমানে ইনপুট স্ট্রিং এর মধ্যে “color” অথবা “colour” যেকোন একটা অথবা দুইটা থাকলে সেটা আমাদের মেশিন একসেপ্ট করবে । মেশিন একসেপ্ট করা মানেই হল খুঁজে পাওয়া ।

ইউআরএল ম্যাচিং

অনেক কিছুইতো শিখলাম এখন আমরা একটু কঠিন রেগুলার এক্সপ্রেশন লেখার চেষ্টা করি । আমরা ইনপুট স্ট্রিং থেকে ইউআরএল বের করে নিয়ে আসব যদি সেটা থাকে । এই কাজটা কর রেগুলার এক্সপ্রেশন দিয়ে ।

প্রথমে একটা ইউআরএল এ কি কি থাকা যাবে না সেটার একটা লিস্ট করিঃ

  • " " (whitespace) থাকা যাবে না ।
  • (<, > ,” , ’ ) এই ক্যারেক্টার গুলোও যাবে না ।

তারমানে আমরা লিখতে পারিঃ

[^\s<>"']+
Regex: [^\s<>”’]+

তাহলে ইউআরএল ম্যাচিং এর রেগুলার এক্সপ্রেশনটা হবেঃ

http://[^\s<>"']+

সামনে আর লিখবো । আর এই লেখাতেও ভুল থাকলে আপনারা ধরিয়ে দেবেন । আপাতত এইটুকুই ।

--

--