জেনে রাখা জরুরী এমন ৮টি রেগুলার এক্সপ্রেশন
() translation by (you can also view the original English article)
রেগুলার এক্সপ্রেশন নিজেই একটি ভাষা। নতুন নতুন প্রোগ্রামিঙের ভাষা শেখার সময় এই উপভাষগুলো বুঝা বড় দায়। অনেক সময় আপনাকে অন্যান্য টিউটোরিয়াল, আর্টিকেল, বা বই পড়তে হয় শুধুমাত্র এই "সহজ" প্যাটার্নগুলো বুঝার জন্য। আজকে আমরা ৮টি রেগুলার এক্সপ্রেশন সম্পর্কে জানব যেগুলো পরবর্তীতে আপনার কোডিং প্রজেক্টে কাজে লাগবে।
শুরু করার আগে, আপনি এনভাটো মার্কেট থেকে কিছু রেগএক্স অ্যাপ্লিকেশন দেখে নিন। যেমন রেগএক্স এক্সট্রাক্টর.
আপনি চাইলে ইমেইল, প্রক্সি, আইপি, ফোন নাম্বার, অ্যাড্রেস, এইচটিএমএল ট্যাগ, ইউআরএল, লিঙ্ক, ডেট, আরও অনেক কিছু এক্সট্রাক্ট করতে পারেন। একটি অথবা একাধিক রেগুলার এক্সপ্রেশন এবং ইউআরএল সোর্স ইনসার্ট করে কাজ শুরু করে দিন।
এক্সট্রাক্ট, স্ক্রেইপ, পার্স, হারভেস্ট।
ব্যবহারের নমুনা
- পুরনো সিএসভি অ্যাড্রেস বুক থেকে ইমেইল এক্সট্রাক্ট করুন।
- এইচটিএমএল ফাইল থেকে ইমেজ সোর্স এক্সট্রাক্ট করুন।
- অনলাইন ওয়েবসাইট থেকে প্রক্সি এক্সট্রাক্ট করুন।
- গুগল থেকে ইউআরএল রেজাল্ট এক্সট্রাক্ট করুন।
রেগুলার এক্সপ্রেশনের পটভূমি
উইকিপিডিয়ার ভাষ্যমতে:
কম্পিউটিঙের ক্ষেত্রে, রেগুলার এক্সপ্রেশনের মাধ্যমে প্রয়োজনীয় টেক্সটের স্ট্রিং, যেমন নির্দিষ্ট কোন ক্যারেক্টার, শব্দ, বা ক্যারেক্টারের প্যাটার্ন ইত্যাদি সংক্ষেপে ও সহজে চিহ্নিত করা যায়। রেগুলার এক্সপ্রেশন (সংক্ষেপে রেগএক্স বা রেগএক্সপি, বহুবচনে রেগএক্সেস, রেগএক্সপিস, বা রেগএক্সেন) আনুষ্ঠানিক ভাষায় লেখা হয়। একজন রেগুলার এক্সপ্রেশন প্রসেসর দিয়ে এটি ভাষান্তর করা সম্ভব। এটি এমন একটি প্রোগ্রাম যা হয় পার্সার জেরারেটর হিসাবে কাজ করে অথবা টেক্সট পরীক্ষা করে প্রদত্ত স্পেসিফিকেশন অনুযায়ী অংশগুলো মিলে যাচ্ছে কিনা তা যাচাই করে।
এখন এটা দিয়ে সত্যিকারের প্যাটার্ন সম্পর্কে খুব বেশি কিছু জানা যায় না। আজ আমি যেসব রেগএক্সেস নিয়ে কাজ করবো সেগুলোতে \w, \s, \1 এবং এই ধরণের আরও অনেক ক্যারেক্টার রয়েছে যেগুলো দেখতে যেমন তার থেকে সম্পূর্ণ ভিন্ন কোন অর্থ বহন করে।
এই আর্টিকেল পড়া শুরু করার আগে আপনি যদি রেগুলার এক্সপ্রেশন সম্পর্কে কিছু জানতে চান তাহলে আমার পরামর্শ হচ্ছে রেগুলার এক্সপ্রেশন ফোর ডামিস নামের স্ক্রিনকাস্ট সিরিজটি দেখে ফেলুন।
আজ আমি আপনাদের যে ৮টি রেগুলার এক্সপ্রেশন সম্পর্কে বলব সেগুলো দিয়ে আপনারা ইউজার নেম, পাসওয়ার্ড, ইমেইল, হেক্স ভ্যালু (যেমন #fff বা #000), স্লাগ, ইউআরএল, আইপি অ্যাড্রেস, এবং এইচটিএমএল ট্যাগ ম্যাচ করাতে শিখাবে। তালিকার যতোই গভীরে প্রবেশ করবেন রেগুলার এক্সপ্রেশন বুঝাটা ততোই কঠিন হয়ে যাবে। শুরুর দিকে প্রতিটা রেগএক্সের ছবি বুঝতে পারা বেশ সহজ।তবে শেষের চারটা সহজে বুঝতে হলে এগুলোর ব্যাখ্যা জেনে নিতে হবে।
রেগুলার এক্সপ্রেশনের ব্যাপারে যে বিষয়টা মনে রাখা জরুরী তা হল এগুলো একই সময়ে সোজা এবং উল্টা দুইভাবেই পড়া যায়। আমরা যখন ম্যাচিং এইচটিএমএল ট্যাগ সম্পর্কে জানব তখন এই বাক্যের মর্মও টের পাব।
নোট: রেগুলার এক্সপ্রেশনে যে ডিলিমিটার ব্যবহার করা হয় সেগুলো মূলত ফরোয়ার্ড স্ল্যাশ, "/" প্রতিটি প্যাটার্ন একটি ডিলিমিটার দিয়ে শুরু এবং শেষ হয়। কোন একটা রেগএক্সে যদি ফরোয়ার্ড স্ল্যাশ দেখা যায় তাহলে সেটাকে ব্যাকস্ল্যাশ দিয়ে মোকাবেলা করতে হবে: "\/"।
১। ইউজার নেম ম্যাচ করা



প্যাটার্ন:
1 |
/^[a-z0-9_-]{3,16}$/ |
2 |
বর্ণনা:
শুরুতে আমরা পার্সারকে স্ট্রিঙের শুরুটা (^) খুঁজতে আদেশ দিবো। এরপর থাকবে কোন ছোট হাতের অক্ষর (a-z), সংখ্যা (0-9), আন্ডারস্কোর, বা হাইফেন। এবার, {3,16} সেটটির মধ্য থেকে অন্তত ৩টি সংখ্যা নিন তবে টার কোনটিরই মান যেন ১৬-এর উপরে না হয়। সবশেষে, আমরা স্ট্রিঙের শেষ অংশ নিয়ে কাজ করবো ($)
যে স্ট্রিংগুলো ম্যাচ করে:
my-us3r_n4m3
যে স্ট্রিংগুলো ম্যাচ করে না:
th1s1s-wayt00_l0ng0beausername (too long)
২। পাসওয়ার্ড ম্যাচ করা



প্যাটার্ন:
1 |
/^[a-z0-9_-]{6,18}$/ |
2 |
বর্ণনা:
পাসওয়ার্ড ম্যাচ করা ইউজার নেম ম্যাচ করার মতোই একটা প্রক্রিয়া। একমাত্র পার্থক্য হচ্ছে ৩ থেকে ১৬ পর্যন্ত অক্ষর, সংখ্যা, আন্ডারস্কোর, বা হাইফেনের বদলে আমাদের ৬ থেকে ১৮ পর্যন্ত প্রয়োজন ({6,18})।
যেসব স্ট্রিং ম্যাচ করে:
myp4ssw0rd
যেসব স্ট্রিং ম্যাচ করে না:
mypa$$w0rd (এখানে একটি ডলারের প্রতীক থাকবে)
৩। হেক্স ভ্যালু ম্যাচ করা



প্যাটার্ন:
1 |
/^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
2 |
বর্ণনা:
আমরা পার্সারকে স্ট্রিঙের শুরুটা খুঁজে বের করার নির্দেশ দিয়ে শুরু করবো (^)। এরপর নাম্বারের প্রতীক থাকাটা অপশনাল কারণ এরপর একটি প্রশ্নবোধক চিহ্ন থাকবে। প্রশ্নবোধক চিহ্ন পার্সারকে এটাই ইঙ্গিত দেয় যে এর আগের সংখ্যাবোধক চিহ্নটি অপশনাল। তবে একই সাথে এটাও জানিয়ে দেয় যে চিহ্নটি থাকলে অবহেলা না করে সেটিকে নিয়ন্ত্রণ করতে হবে। এরপর, প্রথম দলের মধ্যে (বন্ধনীর প্রথম দল) দুইটি ভিন্ন পরিস্থিতি বিরাজ করবে। প্রথমটি হচ্ছে a থেকে f-এর মধ্যে যে কোন ছোট হাতের অক্ষর অথবা কোন একটি সংখ্যা ছয়বার উপস্থিত থাকবে। ভার্টিকাল বারের মাধ্যমে এটা প্রতীয়মান হয় যে আমরা a থেকে f-এর মধ্যে তিনটি ছোট হাতের অক্ষর বা সংখ্যা পেতে পারি। সবশেষে, আমরা স্ট্রিঙের শেষ অংশ নিয়ে কাজ করবো ($)।
ছয়টি ক্যারেক্টার শুরুতে রাখার কারণ হচ্ছে পার্সার #ffffff-এর মতো হেক্স ভ্যালুকে নিয়ন্ত্রণ করবে। আমি যদি এটাকে উল্টে তিনটি ক্যারেক্টারকে সামনে নিয়ে আসতাম তাহলে পার্সার অন্যান্য তিনটি f-কে না নিয়ে শুধুমাত্র #fff-কে তুলে নিত।
যেসব স্ট্রিং ম্যাচ করে:
#a3c113
যেসব স্ট্রিং ম্যাচ করে না:
#4d82h4 (h অক্ষরটি থাকবে)
৪। স্লাগ ম্যাচ করা



প্যাটার্ন:
1 |
/^[a-z0-9-]+$/ |
2 |
বর্ণনা:
আপনি যদি কখনও mod_rewrite এবং প্রিটি ইউআরএলস নিয়ে কাজ করতে যান তাহলে এই রেগএক্সটি আপনাকে ব্যবহার করতে হবে। আমরা পার্সারকে স্ট্রিঙের শুরুটা খুঁজে বের করার নির্দেশ দিয়ে শুরু করবো (^), এরপর এক বা একাধিক (যোগ চিহ্ন) অক্ষর, সংখ্যা, বা হাইফেন থাকবে। সবশেষে, আমরা স্ট্রিঙের শেষ অংশ নিয়ে কাজ করবো ($)।
যেসব স্ট্রিং ম্যাচ করে:
my-title-here
যেসব স্ট্রিং ম্যাচ করে না:
my_title_here (শুধুমাত্র আন্ডারস্কোর থাকবে)
৫। ইমেইল ম্যাচ করা



প্যাটার্ন:
1 |
/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ |
2 |
বর্ণনা:
আমরা পার্সারকে স্ট্রিঙের শুরুটা খুঁজে বের করার নির্দেশ দিয়ে কাজ শুরু করবো (^)। প্রথম গ্রুপের ভিতরে আমরা এক বা একাধিক ছোট হাতের অক্ষর, সংখ্যা , আন্ডারস্কোর, ডট, বা হাইফেন ম্যাচ করাবো। আমি ডট এস্কেপ করে গেছি কারণ তা না করলে সেটা যে কোন ক্যারেক্টার বুঝায়। ঠিক তার পর পরই, সেখানে একটা অ্যাট চিহ্ন থাকবে। এরপ আসবে ডোমেইন নেম যেটা: এক বা একাধিক ছোট হাতের অক্ষর, সংখ্যা, আন্ডারস্কোর, ডট, বা হাইফেন হবে। এরপর দুই থেকে ছয় অক্ষর বা ডটের এক্সটেনশনসহ আরেকটি ডট (এস্কেপড) থাকবে। কান্ট্রি স্পেসিফিক টিএলডিসের কারণে আমার এখানে ২ থেকে ৬ পর্যন্ত আছে (.ny.us বা .co.uk)। সবশেষে, আমরা স্ট্রিঙের শেষ অংশ নিয়ে কাজ করবো ($)।
যেসব স্ট্রিং ম্যাচ করে:
john@doe.com
যেসব স্ট্রিং ম্যাচ করে না:
john@doe.something (খুব বেশি লম্বা টিএলডি)
৬। ইউআরএল ম্যাচ করা



প্যাটার্ন:
1 |
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ |
2 |
বর্ণনা:
এই রেগএক্সটি অনেকটা উপরের রেগএক্স থেকে নেওয়া শেষ অংশের মতো যা "http://" এবং শেষের দিকের কিছু ফাইল স্ট্রাকচারের মধ্যে স্ল্যাপ করা হয়েছে। এটা শুনতে যতোটা সহজ বাস্তবে ততোটা নয়। শুরু করার জন্য আমরা ক্যারেট দিয়ে লাইনের শুরুটা খুঁজে বের করবো।
প্রথম ক্যাপচারিং গ্রুপটি হচ্ছে অল অপশন। এটার কারণে ইউআরএল "http://", "https://" দিয়ে অথবা দুইটির কোনটা ছাড়াই শুরু করতে পারে। http বা https-সহ ইউআরএলগুলো যাতে অনুমতি পায় সেজন্য আমি s-এর পর একটি প্রশ্নবোধক চিহ্ন দিয়েছি। এই পুরো গ্রুপটিকে অপশনাল করার জন্য আমি এটার শেষে একটা প্রশ্নবোধক চিহ্ন দিয়েছি।
এরপর আসবে ডোমেইন নেম: এক বা একাধিক সংখ্যা, অক্ষর, ডট, বা হাইফেনের পর আরেকটি ডট এবং তারপর দুই থেকে ছয় পর্যন্ত অক্ষর বা ডট। পরবর্তী সেকশন হচ্ছে অপশনাল ফাইল এবং ডিরেক্টরি। গ্রুপের ভিতরে আমরা ফরোয়ার্ড স্ল্যাশ, অক্ষর, সংখ্যা, আন্ডারস্কোর, স্পেস, ডট, বা হাইফেনের যে কোন সংখ্যা মেলানোর চেষ্টা করবো। এরপর আমরা বলতে পারব যে এই গ্রুপটিকে আমরা জতবার খুশি ম্যাচ করাতে পারব। এতে করে শেষদিকে একাধিক ডিরেক্টরির সাথে ফাইল ম্যাচ করানো সম্ভব হয়। আমি প্রশ্নবোধক চিহ্নের পরিবর্তে স্টার ব্যবহার করেছি কারণ স্টারের অর্থ হচ্ছে শূন্য বা তার বেশি, শূন্য বা এক নয়। যদি একটি প্রশ্নবোধক চিহ্ন ব্যবহার করা হতো তাহলে শুধুমাত্র একটি ফাইল/ডিরেক্টরি ম্যাচ করানো সম্ভব হতো।
এরপর একটি ট্রেইলিং স্ল্যাশ ম্যাচ করানো হয়, তবে এটি অপশনাল। সবশেষে, আমরা লাইনের শেষ অংশ দিয়ে এটি সমাপ্ত করবো।
যে স্ট্রিং ম্যাচ করে:
https://net.tutsplus.com/about
যে স্ট্রিং ম্যাচ করে না:
http://google.com/some/file!.html (বিস্ময়বোধক চিহ্ন রয়েছে)
৭। আইপি অ্যাড্রেস ম্যাচ করা



প্যাটার্ন:
1 |
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
2 |
বর্ণনা:
আর মিথ্যা বলব না, এই রেগএক্সটি আমি লিখিনি; এটা আমি এখান থেকে পেয়েছি। তার মানে এই না যে এটার প্রতিটা ক্যারেক্টার আলাদা করে জোড়া লাগানোর ক্ষমতা আমার নেই।
প্রথম ক্যাপচার গ্রুপটি আসলে কোন ক্যাপচার গ্রুপ না কারণ
1 |
?: |
2 |
এটা ভিতরে রাখা হয়েছিলো। ফলে পার্সারের কাছে এই গ্রুপটি ক্যাপচার না করার নির্দেশ যায় (শেষের রেগএক্সে এই ব্যাপারে বিস্তারিত বলা হবে)। একই সাথে আমরা এই নন-ক্যাপচারড গ্রুপটিকে একদম শেষে {3}-এর তিনগুণবার পুনরাবৃত্ত করবো। এই গ্রুপে রয়েছে আরেকটি গ্রুপ, একটি সাবগ্রুপ, এবং একটি লিটারাল ডট। পার্সারটি সাবগ্রুপে ম্যাচ খুঁজে বের করার চেষ্টা করে এবং তারপর ডট খুঁজে নিয়ে এগিয়ে যায়।
সাবগ্রুপটিও একটি নন-ক্যাপচার গ্রুপ। এগুলো সবই একগাদা ক্যারেক্টার সেট মাত্র (ব্র্যাকেটের মধ্যে যেগুলো রয়েছে): "25" স্ট্রিঙের পর ০ থেকে ৫-এর মধ্যে কোন একটা সংখ্যা; অথবা "2" স্ট্রিং এবং ০ থেকে ৪-এর মধ্যে যে কোন সংখ্যা এবং অন্য যে কোন সংখ্যা; অথবা একটি অপশনাল জিরো বা দুইটি সংখ্যা রয়েছে পরবর্তীতে এমন একটি, সেক্ষেত্রে দ্বিতীয়টি অপশনাল।
আমরা এগুলোর মধ্যে তিনটি ম্যাচ করার পর পরবর্তী নন-ক্যাপচারিং গ্রুপে চলে যাবো। এখানে যা চাইবে: "25" স্ট্রিঙের পর ০ থেকে ৫ পর্যন্ত যে কোন সংখ্যা; বা "2" স্ট্রিং এবং সাথে ০ থেকে ৪ পর্যন্ত যে কোন সংখ্যা এবং শেষে আরেকটি সংখ্যা; অথবা একটি অপশনাল জিরো বা দুইটি সংখ্যা রয়েছে পরবর্তীতে এমন একটি যেখানে দ্বিতীয়টি অপশনাল হবে।
এই গোলমেলে রেগএক্সটি আমরা স্ট্রিঙের শেষটা দিয়ে সমাপ্ত করবো।
যে সব স্ট্রিং ম্যাচ করে:
73.60.124.136 (না, এটা আমার আইপি অ্যাড্রেস না :P)
যে স্ট্রিং ম্যাচ করে না:
256.60.124.136 (প্রথম গ্রুপটি অবশ্যই "25" হতে হবে এবং শূন্য থেকে পাঁচের মধ্যে একটা সংখ্যা হতে হবে)
৮। এইচটিএমএল ট্যাগ ম্যাচ করা



প্যাটার্ন:
1 |
/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/ |
2 |
বর্ণনা:
তালিকাভুক্ত সবচাইতে দরকারি রেগএক্সের একটি। এটি ভিতরের কন্টেন্টের সাথে যে কোন এইচটিএমএল ট্যাগ ম্যাচ করায়। বরাবরের মতোই, আমরা লাইনের শুরু থেকেই আরম্ভ করবো।
প্রথমে আসবে ট্যাগের নাম। এখানে এক বা একাধিক অক্ষরবিশিষ্ট হতে হবে। এটা প্রথম ক্যাপচার গ্রুপ। ক্লোজিং ট্যাগ দখল করার সময় এটা কাজে লাগবে। এরপরের কাজ হচ্ছে ট্যাগের বৈশিষ্ট্য। এটা অপেক্ষাকৃত বড় (>) চিহ্নটি ছাড়া যে কোন ক্যারেক্টার হতে পারবে। যেহেতু এটা অপশনাল, আবার আমি একটার বেশি ক্যারেক্টার ম্যাচ করাতে চাচ্ছি, কাজেই এখানে স্টার ব্যবহার করা হয়েছে। প্লাস চিহ্নটি বৈশিষ্ট্য ও মূল্য নির্ধারণ করে, অন্যদিকে স্টারের মাধ্যমে আপনার যতোগুলো বৈশিষ্ট্য লাগবে পাবেন।
এরপর আসবে তৃতীয় নন-ক্যাপচার গ্রুপ। ভিতরে হয় একটি অপেক্ষাকৃত বড় প্রতীক, কিছু কন্টেন্ট, এবং একটি ক্লোজিং ট্যাগ থাকবে অথবা কিছু স্পেস, একটি ফরোয়ার্ড ফ্ল্যাশ, এবং একটি অপেক্ষাকৃত বড় প্রতীক থাকবে। প্রথম অপশন একটি গ্রেটার দ্যান সাইন, এবং তারপর যে কোন সংখ্যার ক্যারেক্টার ও একটি ক্লোজিং ট্যাগ খুঁজে বের করে। \1 ব্যবহার করা হয় যেটি প্রথম ক্যাপচারিং গ্রুপে ক্যাপচার করা কন্টেন্টকে নির্দেশ করে। এই ক্ষেত্রে এটি ছিল ট্যাগের নাম। এখন আমরা যদি তা ম্যাচ করাতে না পারি তাহলে একটি সেলফ-ক্লোজিং ট্যাগ (img, br, বা hr ট্যাগের মতো) খুঁজে বের করতে হবে। এখানে "/>"-সহ এক বা একাধিক স্পেস দরকার হবে।
রেগএক্সটি লাইনের শেষটা দিয়ে সমাপ্ত হবে।
যে স্ট্রিং ম্যাচ করে:
Nettuts">http://net.tutsplus.com/">Nettuts+
যে স্ট্রিং ম্যাচ করে:
<img src="img.jpg" alt="My image>" /" (অ্যাট্রিবিউটগুলোতে গ্রেটার দ্যান চিহ্ন থাকতে পারবে না)
উপসংহার
আশা করি আপনি রেগুলার এক্সপ্রেশনের বিষয়টি আগের চাইতে কিছুটা ভালোভাবে বুঝতে পেরেছেন। আশা করছি আপনি ভবিষ্যতে বিভিন্ন প্রজেক্টে এই রেগএক্সগুলো ব্যবহার করবেন! অনেক সময়, রেগএক্স ক্যারেক্টারকে ক্যারেক্টার দিয়ে পাঠোদ্ধার করার দরকার পড়ে না। তবে কখনও কখনও এটা করলে আপনার শেখা ত্বরান্বিত হবে। মনে রাখবেন, রেগুলার এক্সপ্রেশন দেখে ভয় পাবেন না। আপনার কাছে বিপরীতটা মনে হতে পারে তবে সত্যি কথা বলতে আপনার জীবন আরও সহজ করে দিবে এই রেগএক্স। একবার চেষ্টা করে দেখুন রেগুলার এক্সপ্রেশন ছাড়া স্ট্রিং থেকে কোন একটা ট্যাগ বের করে আনতে!
আমাদের টুইটারে ফলো করুন, বা প্রতিদিন আরও নতুন নতুন ওয়েব ডেভেলপমেন্ট সম্পর্কিত টিউটোরিয়াল এবং আর্টিকেল পেতে সাবস্ক্রাইব করুন NETTUTS RSS Feed-এ। এনভাটো মার্কেটে কয়েকটি রেগএক্স অ্যাপ্লিকেশন দেখে নিন।