রেগুলার এক্সপ্রেশন (প্রথম কিস্তি )
রেগুলার এক্সপ্রেশন(Regular Expression) হল এমন একটা এক্সপ্রেশন যা ব্যবহার করে আমরা কোন স্ট্রিং(String) থেকে যা খুঁজছি সেটা বের করে আনতে পারি ।
যেমন ধরেন , "/shajal/" একটা রেগুলার এক্সপ্রেশন । এইটা ব্যবহার করে আমরা "shajal goes to school" এর মাঝে "shajal" শব্দটি আছে কিনা আর থাকলেও কোথায় ,কত বার আছে এগুলো সব বের করতে পারব ।
উপরের উদাহরণটি আসলে রেগুলার এক্সপ্রেশনের খুব সহজ একটা উদাহরণ । সব রেগুলার এক্সপ্রেশন এত সহজ হয় না । তাহলে কেমন হয় সেগুলো ? চলুন একটু দেখার চেষ্টা করি ।
একটা রেগুলার এক্সপ্রেশনে দুই ধরনের ক্যারেক্টার থাকতে পারে ।
- লিটারেল ক্যারেক্টার (Literal Character)
- মেটা ক্যারেক্টার (Meta Character)
লিটারেল ক্যারেক্টারঃ
আমাদের উপরের উদাহরণের ক্ষেত্রে "/shajal/" রেগুলার এক্সপ্রেশনটির প্রতিটি ক্যারেক্টার হল এক একটি লিটারেল ক্যারেক্টার । এখন আমরা একটু অন্যভাবে চিন্তা করি । ধরলাম “shajal” হল একটা বাক্স । তার বাম এবং ডান পাশে দুইটা পাইপ আছে ।
এই বাক্সটা অনেকটা মেটাল ডিটেক্টরের মত কাজ করে । মেটাল ডিটেক্ট করতে পারে এরকম কোন বাক্সের মধ্যে দিয়ে আমরা যদি কোন মেটাল নিয়ে যাই তাহলে সেটি আমাদের সিগনাল দিয়ে জানান দিয়ে যে এর মধ্যে মেটাল জাতীয় কিছু আছে । ঠিক তেমন করেই আমরা যদি “shajal goes to school” স্ট্রিংকে উপরের বাক্সের মধ্য দিয়ে প্রবেশ করাই তাহলে বক্সটি আমাদের বলবে এই স্ট্রিং এর মাঝে “shajal” শব্দটি আছে কিনা ।
আমরা এই বাক্সের বাম পাশের পাইপ দিয়ে স্ট্রিং এর শব্দ গুলো এক এক করে ইনপুট দিতে থাকব । যেই শব্দটার জন্য আমরা বাম পাশের পাইপ থেকে বাক্সের মধ্যে দিয়ে ডান পাশের পাইপে যেতে পারব সেই শব্দটাই আমরা খুঁজছি । এখানে “shajal goes to school” স্ট্রিং এর “goes” “to” “school”কোনটি জন্য আমরা বাক্সের বাম পাশ থেকে ডান পাশে যেতে পার না । শুধুমাত্র “shajal”এর জন্য পারব ।
মেটা ক্যারেক্টারঃ
এখন যদি আমাদের রেগুলার এক্সপ্রেশনটা এভাবে লিখি “/^shajal/” । তাহলে ছবিটা হবে এরকম
এর মানে হল “shajal” স্ট্রিংকে অবশ্যই লাইনের প্রথমে হতে হবে । তারমানে আমাদের ইনপুট স্ট্রিং যদি “shajal goes to school ” এটা হয় তাহলে এই রেগুলার এক্সপ্রেশন দিয়ে “shajal” কে খুঁজে পাওয়া যাবে । কিন্তু “zerin and shajal go to school” এই ইনপুট স্ট্রিং এর জন্য “shajal” কে খুঁজে পাওয়া যাবেনা কারণ “shajal” লাইনের প্রথমে নেই । এখানে “^” হল মেটা ক্যারেক্টার ।
রেগুলার এক্সপ্রেশন আসলে প্যাটার্ন ম্যাচিং মেশিন বানানোর একটা উপায় । আমরা এক্সপ্রেশন বা রুলটা লেখি আর সেই অনুযায়ী মেশিন তৈরি হয় । তারপর সেই মেশিন মধ্যে দিয়ে আমরা আমাদের স্ট্রিং ইনপুট দিলে মেশিন একসেপ্ট (accept)করে অথবা রিজেক্ট(reject) করে । প্যাটার্ন পেয়ে গেলে একসেপ্ট করে ,না পেলে রিজেক্ট ।
এরকম আরো কিছু মেটা ক্যারেক্টার আছে ।
. যেকোন ক্যারেক্টার একবার থাকলেই হল।
(a,b,…..,z,A,B…..,Z,0,1…9,-,……. etc)যেটাই দেই এই মেশিন সেটা একসেপ্ট করবে । তারমানে আপনি যেকোন ক্যারেক্টার ইনপুট দিয়ে বাক্সের বাম পাশ থেকে ডান পাশে যেতে পারবেন ।
\d 0 থেকে শুরু করে 9 পর্যন্ত যেকোন ডিজিট।
\d
/মেশিন এর ভিতর দিয়ে (0–9) এর মধ্যে যেকোন ডিজিট ইনপুট দিলেই সেই ডিজিটকে একসেপ্ট করবে।
\w (a-z,A-Z,0-9) এই ক্যারেক্টারগুলো দিয়ে গঠিত যেকোন শব্দ
এই মেশিন এর ভিতর দিয়ে (a-z,A-Z,0–9) ক্যারেক্টারগুলো দিয়ে গঠিত যেকোন শব্দ (word) ইনপুট দিলেই একসেপ্ট করবে।
বাকি গুলো আপনারা চিন্তা করে বের করতে পারবেন । তাই আমি আর কথা না বাড়াই ।
\W \w এর ঠিক উল্টা । (a-z,A-Z,0-9) এই ক্যারেক্টারগুলো ছাড়া গঠিত যেকোন শব্দ।
\s যেকোন whitespace ক্যারেক্টার।
\S \s এর ঠিক উল্টা
পজিশন মেটা ক্যারেক্টারঃ
এগুলো সাধারণত উপরের মেটা ক্যারেক্টারগুলোর সাথে ব্যবহার করা হয় ।
^ লাইনের শুরু বোঝাতে
উদাহরণঃ /^shajal/
এক্ষেত্রে "" শব্দটা লাইনের প্রথমে হতে হবে। তাহলে ইনপুট স্ট্রিংকে একসেপ্ট করবে ।
$ লাইনের শেষ বোঝাতে
উদাহরণঃ /shajal$/
এই মেশিনটা সেই সকল স্ট্রিংকেই একসেপ্ট করে যাদের শেষ শব্দটি "shajal"
\b যেকোন ওয়ার্ড এর বাউন্ডারি বোঝাতে
উদাহরণঃ /\bcat/
/\bcat/ এক্সপ্রেশনটি শুধু সেই সকল শব্দকে(word) একসেপ্ট করে যাদের শুরু হয় "cat" দিয়ে।যেমনঃ catatonic , catfish
উদাহরণঃ /cat\b/
/\bcat/ এক্সপ্রেশনটি শুধু সেই সকল শব্দকে(word) একসেপ্ট করে যাদের শেষ হয় “cat” দিয়ে।যেমনঃ tomcat
উদাহরণঃ /\bcat\b/
এইটা কি হবে আপনারাই চিন্তা করে নিন ।
কোয়ান্টিফায়ারঃ
এগুলো সাধারণত ক্যারেক্টারগুলোর পরে বসে সেগুলোর কাজ কর্ম পরিবর্তন করে দেয় । কোয়ান্টিফাই মানে হল পরিমাণ বলে দেয়া । তার মানে কোন কিছু কতবার হবে বা তার পরিমাণ কতটুকু সেটা বলে দেয়া ।
? এর আগের ক্যারেক্টারটি একবার থাকলেও হবে অথবা না থাকলেও হবে।
উদাহরণঃ /sa?/
ছবি দেখলেই বোঝা যাচ্ছে যে , ক্যারেক্টারটি একবার থাকলেও আমরা বাম পাশ থেকে ডান পাশে যেতে পারব অর্থাৎ মেশিন একসেপ্ট করবে । একবার না থাকলেও পারব । কিন্তু “s” ক্যারেক্টারটি অবশ্যই থাকতে হবে ।
* এর আগের ক্যারেক্টারটি অসংখ্যবার থাকলেও হবে অথবা না থাকলেও হবে।
উদাহরণঃ /sa*/
এই মেশিনটি "" এর পরে "" না থাকলেও অথবা যতবার খুশি ততবার থাকলেও একসেপ্ট করবে ।
+ এর আগের ক্যারেক্টারটি অসংখ্যবার থাকলেও হবে অথবা অন্তত একবার থাকতে হবে।
উদাহরণঃ /sa+/
{min,max} এর আগের ক্যারেক্টারটি সর্বনিম্ন min এবং সর্বোচ্চ max সংখ্যকবার থাকতে পারবে
উদাহরণঃ /sa{2,3}/
এখানে {2,3} এর আগের ক্যারেক্টার “a” সর্বনিম্ন 2 এবং সর্বোচ্চ 3 সংখ্যকবার থাকতে পারবে ।
ক্যারেক্টার ক্লাস
এই ধরনের রেগুলার এক্সপ্রেশনগুলোকে ক্যারেক্টার ক্লাস বলা হয় । এখানে প্রতিটা ক্যারেক্টারের মাঝে or রিলেশন আছে । অর্থাৎ শব্দগুলোর মাঝের যেকোন একটা ক্যারেক্টার
এর সাথে
অল্টারনেশন
“|” এই মেটা ক্যারেক্টারেটি or হিসাবে কাজ করে । যেমন আমি যদি “color” অথবা “colour” এই দুইটা শব্দ ইনপুট স্ট্রিং থেকে রেগুলার এক্সপ্রেশন ব্যবহার করে খুঁজে বের করতে চাই তাহলে সেক্ষেত্রে এক্সপ্রেশনটি হবে /color|colour/ । একে অল্টারনেশন বলে ।
তারমানে ইনপুট স্ট্রিং এর মধ্যে “color” অথবা “colour” যেকোন একটা অথবা দুইটা থাকলে সেটা আমাদের মেশিন একসেপ্ট করবে । মেশিন একসেপ্ট করা মানেই হল খুঁজে পাওয়া ।
ইউআরএল ম্যাচিং
অনেক কিছুইতো শিখলাম এখন আমরা একটু কঠিন রেগুলার এক্সপ্রেশন লেখার চেষ্টা করি । আমরা ইনপুট স্ট্রিং থেকে ইউআরএল বের করে নিয়ে আসব যদি সেটা থাকে । এই কাজটা কর রেগুলার এক্সপ্রেশন দিয়ে ।
প্রথমে একটা ইউআরএল এ কি কি থাকা যাবে না সেটার একটা লিস্ট করিঃ
- " " (whitespace) থাকা যাবে না ।
- (<, > ,” , ’ ) এই ক্যারেক্টার গুলোও যাবে না ।
তারমানে আমরা লিখতে পারিঃ
[^\s<>"']+
তাহলে ইউআরএল ম্যাচিং এর রেগুলার এক্সপ্রেশনটা হবেঃ
http://[^\s<>"']+
সামনে আর লিখবো । আর এই লেখাতেও ভুল থাকলে আপনারা ধরিয়ে দেবেন । আপাতত এইটুকুই ।