এক পলকে রেগুলার এক্সপ্রেশন(Regular Expression): পর্ব ২/২

এই সিরিজটি আমি দুইটা পর্বে ভাগ করে লিখেছি। এটা দ্বিতীয় পর্ব, আর আগের পর্ব দেখতে চাইলে পাশে পাবেন…

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

অ্যাসারসন(সামনে ও পিছনে দেখা) - Assertions (Look ahead and Look behind):

এটাও গত পর্বে ডিসকাস করা Anchor এর মতোই অনেকটা। কিন্তু এক্ষেত্রে আরো স্পেসেফিকভাবে সার্চ করা যাবে। এগুলো সাধারনত প্রথম ব্র্যাকেটস () এর ভিতরে থেকে কাঙ্ক্ষিত ক্যারেক্টার/স্ট্রিং এর আগে বা পরে বসে সেটার উপর কন্ডিশন অ্যাপ্লাই করে।

?= => ধরি আমাদের এরকম (d(?=r)) একটা রেগুলার এক্সপ্রেশন আছে। এর মানে হচ্ছে এরকম যদি d এর পরে r থাকে তাহলেই একমাত্র d টাকে সিলেক্ট করা হবে। এক্ষেত্রে r নিজে সিলেক্ট হবে না। আমরা r কে দেখে জাস্ট d কে সিলেক্ট করতে পারবো।

?! => এটা ঠিক আগেরটার উল্টো। d(?!r) মানে হচ্ছে এমন d কে সিলেক্ট করা হবে যার পরে r নাই। কোনো d এর পরে r থাকলে তাহলে সেটা সিলেক্ট করা হবে না।

***এগুলো নিজে সিলেক্ট হয় না, জাস্ট কন্ডিশন হিসেবে কাজ করে

*** (?<=r)d এবং (?<!r)d অ্যাসারসনও আছে, যেটা আমাদের অ্যাটম কোড এডিটরে কাজ করে না। কিন্তু কাজ অনেকটা এগুলোর মতোই, জাস্ট এরা স্ট্রিং এর সামনে বসে।

ব্যাক রেফারেন্স (Back-references):

আগের পর্বে আমরা গ্রুপিং নিয়ে আলোচনা করেছিলাম। গ্রুপিং রেফারেন্স হিসাবে ক্যাপচার করে বলেও বলেছিলাম। এখন এই ক্যাপচার করা রেফারেন্সগুলো আমরা ইউজ করতে পারি নানারকমভাবে। ব্যাক রেফারেন্স এর মধ্যে অন্যতম। আমরা

আমরা যখন () দিয়ে গ্রুপিং করি তখন এদের ক্রম অনুযায়ী ১ থেকে যতটা গ্রুপ করা হবে তত পর্যন্ত রেফারেন্স নাম্বার সেট করা হবে। মানে হচ্ছে আমাদের যদি এরকম একটা এক্সপ্রেশন থাকেঃ

(\w)(\s)(\d)

তাহলে এখানে ৩ টা গ্রুপ আছে। বাম দিকে যথাক্রমে এদেরকে রেফারেন্স নাম্বার 1, 2 ও 3 দিয়ে পরে অ্যাক্সেস করা যাবে।

এখন ব্যাক রেফারেন্স এ প্রথমে\ দিয়ে পরে রেফারেন্স নাম্বার উল্লেখ করা হয়। এটা ইউজ করা হয় মূলত আপনি গ্রুপ করা একই রকম টেক্সট যদি মিলাতে চান পরবর্তিতে।

ধরি আমাদের একটা স্ট্রিং আছে এরকমঃ

Zonayed Zonayed

এখন \w+ লিখলে প্রথম অংশ Zonayed এবং পরে আলাদাভাবে পরের Zonayed সিলেক্ট হবে। কিন্তু আমরা যদি পুরোটা সিলেক্ট করতে চাই তাহলে একটা অ্যাপ্রোচ নিতে পারি এভাবেঃ

\w+\s\w+

এটা পুরোটাকে সিলেক্ট করবে। কিন্তু আমরা এখানে \w+ ইউজ করে একবার Zonayed টেক্সটটাকে ক্যাপচার করেছি। এখন সেইম টেক্সট আবার ক্যাপচার করার জন্যে আমাদের আবার \w+ লেখার দরকার নাই। বরং আমরা প্রথমটাকে ব্র্যাকেটস () এর ভিতরে ঢুকিয়ে সেটাকে রেফারেন্স হিসাবে ইউজ করতে পারিঃ

(\w+)\s\1

এটা ঠিকমতো পুরো Zonayed Zonayed দুইটা ওয়ার্ডকেই একসাথে সিলেক্ট করে ফেলবে। এভাবে মাল্টিপল রেফারেন্স থাকতে পারে। একইভাবে এরা এদের ক্রমিক নাম্বার অনুযায়ী কাজ করবে।

*** সেইম প্যাটার্ন নয় বরং সেইম স্ট্রিং হলেই একমাত্র রেফারেন্স কাজ করবে। যেমন এখানে Zonayed এর মতো আরেকটা Zonayed থাকায় কাজ করেছে। আপনি Zonayed এর সাথে Ahmed রেফারেন্স দিয়ে মিলাতে পারবেন না। এরা একই প্যাটার্নের হলেও ঠিক একই লেখা না।

স্ট্রিং রিপ্লেসমেন্ট (String Replacement)

ঠিক আগের মতোই আপনি প্রথম ব্র্যাকেটস() দিয়ে গ্রুপ করে পরবর্তিতে রেফারেন্স হিসেবে ইউজ করতে পারবেন। কিন্তু এখানে আরেকটু মজাদার ব্যাপার আছে। আপনি চাইলে স্ট্রিং রিপ্লেসও করতে পারবেন এই ক্যাপচারড গ্রুপ এর রেফারেন্স নাম্বার দিয়ে।

এক্ষেত্রে ধরলাম আপনি একটা টেক্সট সার্চ দিলেন, এবং সার্চ শেষে খুঁজেও পেলেন আপনার কাঙ্ক্ষিত টেক্সট। এখন আপনি চাচ্ছেন সেই টেক্সট এর কিছু অংশ বাদ দিতে আর কিছু অংশ রাখতে। এখানেই স্ট্রিং রিপ্লেসমেন্ট রেফারেন্স কাজে দেয়।

আপনার গ্রুপ করা প্যাটার্নগুলোর সিলেক্ট করা টেক্সটগুলো পরে রিপ্লেসের বক্স থেকে প্রথমে $ সাইন এবং পরে রেফারেন্স নাম্বার দিয়ে অ্যাক্সেস করতে পারবেন।

Find ইনপুট ফিল্ড ও Replace ইনপুট ফিল্ড

আপনি আপনার এডিটরের Replace ইনপুট ফিল্ড থেকেও চাইলে ক্যাপচারকৃত টেক্সটগুলো ম্যাচ করতে পারবেন

$& => আমাদের প্যাটার্ন দিয়ে যে টেক্সটগুলো সিলেক্ট করেছি সবগুলো অ্যাক্সেস করতে পারবেন $& দিয়ে। ধরি আমার এরকম একটা টেক্সট আছেঃ

Zonayed Ahmed

এখন আমি চাচ্ছি আমার এই টেক্সটার সাথে আরেকটা নাম অ্যাড করতে এরকমভাবেঃ

Zonayed Ahmed Zunaid

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

(\w+)\s(\w+)

এখন রিপ্লেস বক্সে এভাবে লিখলেই আমি আমার কাঙ্ক্ষিত রেজাল্ট পাবোঃ

$& Zunaid

আশা করি এটা কিভাবে কাজ করে বুঝতে পেরেছেন।

$1 , $2… => রেফারেন্স নাম্বার দিয়ে রিপ্লেস করার জন্যে ইউজ করা হয়। গ্রুপ ক্রম অনুযায়ী রেফারেন্স নাম্বারগুলো পাবে। যেমন আমার এই উদাহরনে দুইটা গ্রুপ আছে।

Zonayed Ahmed

প্যাটার্নঃ

(\w+)\s(\w+)

এখন আমি সেটা $1 দিয়ে রিপ্লেস করলে প্রথম প্যাটার্নে ম্যাচ করা টেক্সটগুলো দিয়ে রিপ্লেস হবে এভাবেঃ

ফলাফলঃ

Zonayed

নিচে ডোমেইন নেইম দিয়ে একটা সুন্দর উদাহরন দেওয়া হয়েছে ঐটা থেকে আরো ক্লিয়ার হবেন আশা করি।

কিছু উদাহরণঃ

সবশেষে কিছু রিয়েল লাইফের উদাহরন দিয়ে আমার লেখা শেষ করতে চাই।

ফোন নাম্বারের প্যাটার্ন মিলানোঃ আমাদের দেশের ফোন নাম্বারগুলোর নির্দিষ্ট প্যাটার্ন আছে। শুরু হবে +88 দিয়ে বা +88 নাও থাকতে পারে। আবার নাম্বারে অবশ্যই 01 থাকবে নাইলে ঐটা ভ্যালিড মোবাইল নাম্বার না।

এখান থেকে ভ্যালিড নাম্বারগুলো সার্চ করতে চাইঃ

+8801814274346
01814274346
19223834032
01814274346098
+880181427434698

তাহলে প্যাটার্নটা অনেকটা এরকম হতে পারেঃ

(\+88)?01\d{9}\b

এই প্যাটার্ন শুধুমাত্র ভ্যালিড নাম্বারগুলোকেই সিলেক্ট করবেঃ

ব্যাখ্যাঃ প্রথম গ্রুপ পুরোটা অপশনাল, থাকতেও পারে নাও থাকতে পারে। পরের 01 অবশ্যই থাকবে, তারসাথে ৯টা ডিজিট থাকে আমাদের দেশের ফোন নাম্বারগুলোয়। আমি \d{9} দিয়ে সেটাই বুঝিয়েছি এবং সবশেষে ওয়ার্ড বাউন্ডারী দিয়ে দিয়েছি যাতে এর বেশী কিছু থাকলে সেটা আর সিলেক্ট না হয়।

নামের প্যাটার্ন মিলানোঃ আমাদের নামগুলোও অনেকরকমের হতে পারি। নিচের সবগুলো নাম সিলেক্ট করতে চাইঃ

Md Firoz Khan
Mr. Tmnt
Mr Abul Miah
Mrs. Takla Akhter
Mrs Takia Rahman
MD Sayeed Munshi
Mr Zonayed Ahmed

তাহলে প্যাটার্নটা অনেকটা এরকম হতে পারেঃ

M(rs|r|d)\.?\s\w*(\s\w*)?

এটা সবগুলো নাম সিলেক্ট করবে

ব্যাখ্যাঃ এখানে প্রথমে M কমন সব নামগুলোর জন্যেই। তারপরে হয় rs অথবা r অথবা d হবে, তারপর একটা ডট . কোথাও কোথাও আছে(দেখুন এসকেপ ক্যারেক্টার ইউজ করা হয়েছে)। তারপর একটা স্পেসের জন্যে \s তারপর একটা গ্রুপের মধ্যে (\s\w*) যেটার শেষে ? ইউজ করা হয়েছে এই গ্রুপ টা একটা নামে নাই সেজন্যে।

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

[email protected]

[email protected]

[email protected]

[email protected]

এজন্যে প্যাটার্নটা অনেকটা এরকম হতে পারেঃ

[\w.-]+@\w+\.\w{2,5}

এটা সবগুলো ইমেইল অ্যাড্রেস ম্যাচ করবেঃ

ব্যাখ্যাঃ আমাদের ইমেইলের প্রথম ভাগে ওয়ার্ড ক্যারেক্টারসহ আরো ক্যারেক্টার(যেমন . ডট বা - ড্যাশ) থাকতে পারে। আর এগুলো একাধিক থাকতে পারে, আর তাই আমি [\w.-]+ ইউজ করেছি। তারপরের অংশে মাস্ট একটা @ থাকবে, আর তাই আমি এটা দিয়েছি। তারপরে ডোমেইন নেম মিলানোর জন্যে \w+ দিয়েছি। তারপর মাস্ট একটা . ডট থাকবে(এসকেপ ক্যারেক্টার ইউজ করা হয়েছে এর সাথে)। এবং সবশেষে ডোমেইন নেইমের এক্সটেনশন। ডোমেইন নেইম এক্সটেনশন ২ ক্যারেক্টার থেকে ৫ ক্যারেক্টার পর্যন্ত হতে পারে(প্রকৃতপক্ষে আরো লম্বাও হয়, তবে আমি এখানে ২ থেকে ৫ দিয়েছি), আর সেজন্যেই \w{2,5} লিখেছি।

ওয়েবসাইটের লিংকের প্যাটার্ন মিলানোঃ আমাদের ওয়েবসাইটের লিংকগুলোও নির্দিষ্ট প্যাটার্ন মেইন্টেইন করে চলে। আমরা চাইলে ভ্যালিড লিঙ্ক বের করতে পারবো রেগুলার এক্সপ্রেশন দিয়ে। এখন নিচের সবগুলো লিংকের জন্যে একটা প্যাটার্ন চাচ্ছিঃ

http://amaarname.net

https://www.zonayed.me

https://google.com

http://facebook.edu

প্যাটার্নটা অনেকটা এরকম হতে পারে, ধরে নিলাম http বা https মাস্ট থাকতে হবেঃ

https?://(www.)?\w+\.\w{2,10}

এটা সবগুলো লিংক সিলেক্ট করবেঃ

ব্যাখ্যাঃ আমরা ধরে নিয়েছি http বা https মাস্ট থাকতে হবে। তারপর s টা থাকতেও পারে নাও থাকতে পারে, তাই ? ইউজ করা হয়েছে। তারপর পুরো www. থাকতেও পারে আবার নাও থাকতে পারে, আর তাই পুরোটাকে গ্রুপ করে সেটার সাথে ? ইউজ করা হয়েছে সেটা বুঝানোর জন্যে। তারপর ওয়ার্ড ক্যারেক্টার অনেকগুলা হতে পারে \w+, তারপর একটা ডট . মাস্ট। সবশেষে ডোমেইন নেইম এক্সটেনশন ২ ওয়ার্ড ক্যারেক্টার থেকে শুরু করে ১০ ওয়ার্ড ক্যারেক্টার পর্যন্ত হতে পারে সেজন্যে \w{2,10} ইউজ করা হয়েছে।

ওয়েবসাইটের লিংক থেকে ডোমেইন নেইম পৃথকীকরণঃ

ধরি আগের উদাহরন থেকেই আমরা সবগুলো ওয়েবসাইটের লিংক থেকে শুধুমাত্র ডোমেইন নেইম আর সাথে এক্সটেনশনটা রাখতে চাচ্ছি এরকম্ভাবেঃ

zonayed.me

এখন উপরের প্যাটার্নটাকে একটু মডিফাই করে গ্রুপিং করতে হবে যাতে পরবর্তিতে রেফারেন্স ইউজ করে আমি আমার কাঙ্ক্ষিত ফলাফলে যেতে পারি। মডিফাইড প্যাটার্নটা এরকম হতে পারেঃ

(https?://)(www.)?(\w+\.\w{2,10})

লক্ষ্য করুন এখানে আমি এমনভাবে গ্রুপিং করেছি যাতে পরবর্তিতে আমি রেফারেন্স ইউজ করে আমার কাঙ্ক্ষিত ফলাফল পেতে পারি সহজেই। এখন রিপ্লেস ইনপুট বক্সে এভাবে লিখে রিপ্লেস অল দিলে দেখবেন আমরা যেভাবে চাচ্ছি সেভাবে রিপ্লেস হয়ে গেছে।

$3

ব্যাখ্যাঃ এখানে তিনটা গ্রুপ আছে। তারমধে সবার শেষের অর্থাৎ ৩ নাম্বারটা দিয়েই আমরা বাকী সব রিপ্লেস করতে চাচ্ছি। আর সেজন্যেই রেফারেন্স হিসেবে $3 ইউজ করে আমরা আমাদের ফলাফল পেয়ে গেছি। অনেক সুন্দর…!

*** আমি এখানে যে অ্যাপ্রোচগুলো নিয়েছি এগুলাই ফিক্সড না, আপনি চাইলে আরো ছোটো করে, আরো সাজিয়েও রেগুলার এক্সপ্রেশন লিখতে পারবেন। গুগল করে রেডিমেট এক্সপ্রেশনও পেতে পারেন সহজেই।

আজকে এই পর্যন্তই, আশা করি কিছুটা হলেও রেগুলার এক্সপ্রেশন সম্পর্কে ধারণা হয়েছে আপনার। অবশ্যই আপনার মন্তব্য জানাতে ভুলবেন না। আর কোনো ভুল পেলে বা কনফিউশন থাকলে আমাকে অবশ্যই যেকোনোভাবে জানাবেন।

শেয়ার করুন

লেখাটি ভাল লাগলে সোশ্যাল মিডিয়ায় শেয়ার করুন। আপনার কলিগ, বন্ধু কিংবা প্রিয় কারও কাজে লাগতে পারে। জানেন তো, শেয়ারিং ইজ কেয়ারিং!

সাবস্ক্রিপশন সেন্টার

প্রতিদিন ওয়েবসাইটে আসা আপনার জন্য কষ্টকর হতে পারে। তাই যখনই আমি নতুন ব্লগ পোস্ট, সিরিজ, বই বা ভিডিও পাবলিশ করব,
তখনই তা আপনার ইমেইলে পেতে সাবস্ক্রাইব করুন। নো স্প্যামিং প্রমিজ!