Tag Archives: স্ট্রিং অপারেশান

রেগুলার এক্সপ্রেশন -এ শেষ।

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

Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.

গত লেখায় আমরা এই গিনিপিগ স্ট্রিং থেকে বছর বের করার প্যাটার্ন লিখেছিলাম, যা ছিলো এরকমঃ

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /\d{4}/;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
 ["2008"]

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

মডিফায়ার ফ্ল্যাগ অর্থ
g g মানে গ্লোবাল অর্থাৎ একবার মিল পেলে খোঁজা বন্ধ না করে সম্পূর্ণ স্ট্রিং-এ  খুঁজবে।
i ইন-কেইস সেনসিটিভ মানে ছোট বড় সকল বর্ণ একই বিবেচনা করবে।
m m মানে মাল্টিলাইন। মাল্টিলাইনযুক্ত স্ট্রিং-এর প্রতিটি লাইনের শুরু ও শেষ আলাদাভাবে বিবেচনা করবে।

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

var str = 'Mr. Alu and mr. Potol is closed friend since 2008. They are studying in same university in the session 2008-2009.';
var pattern = /\d{4}/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["2008", "2008", "2009"]

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

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /mr\./gi;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["Mr.", "mr."]

এখানে দুটো বিষয় লক্ষ্যনীয়,

১। যেহেতু Mr. এবং mr. দুটোই আছে, তাই ফ্ল্যাগ g এর সাথে i ব্যবহার করেছি,  এর ফলে কেইস বিবেচনা করবে না।

২। যেহেতু ডট (.) একটি বিশেষ ক্যারেক্টার কিন্তু আমরা লিটার‍্যালি বিবেচনা করতে চাচ্ছি তাই একে স্কেপ করা লাগবে।বিশেষ ক্যারেক্টারকে স্কেপ করার জন্যে তার আগে একটা ব্যাকওয়ার্ড স্ল্যাশ দিতে হয়।

আচ্ছা, এখানে যদি আমরা ইন-কেইস সেনসিটিভ মডিফায়ার i ব্যবহার না করি তাহলে কি প্যাটার্নটি তৈরি করা যাবে? হ্যাঁ যাবে, সেক্ষেত্রে আমাদের দুইটি প্যাটার্ন লাগবে। একটি প্যাটার্ন লাগবে Mr. জন্যে এবং আরেকটি প্যাটার্ন লাগবে mr. এর জন্যে। একই প্যাটার্ন-এ এরকম এক বা একাধিক সাব-প্যাটার্ন লেখা যায় এবং সাব-প্যাটার্নগুলো লিখতে হয় প্রথম বন্ধনির ভিতরে। সাব-প্যাটার্ন ব্যবহার করে উপরের প্যাটার্নটি নতুন করে লিখলে নিচের মতো হবে। লক্ষ্যনীয় যে, সাব-প্যাটার্ন দুটির মাঝে OR সাইন | ব্যবহার করা হয়েছে যার মানে দুটির মাঝে যেকোনো একটি।

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /(Mr\.|mr\.)/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["Mr.", "mr."]

রেগুলার এক্সপ্রেশনে প্রথম বন্ধনির ভিতরে এরকম সাব-প্যাটার্নের আলাদা গুরুত্ব রয়েছে এবং সেটি হচ্ছে মূল প্যাটার্নের মিল বা ম্যাচিং গুলার সাথে সাব-প্যাটার্নের ম্যাচিংগুলোও আলাদা ভাবে পাওয়া যায় বা ক্যাপচার করা যায়। এ জন্যে রেগুলার এক্সপ্রেশনে এদেরকে ক্যাপচারিং গ্রুপ বলে । ধরা যাক, আমরা আমাদের গিনিপিগ স্ট্রিং-এ কি কি নাম আছে সেগুলো বের করতে চাচ্ছি এবং নাম বলতে আমরা বুঝি যাদের প্রথমে Mr./mr. থাকবে, তারপরে একটি স্পেস, তারপরে কিছু ওয়ার্ড ক্যারেক্টার এবং শেষ হবে একটি স্পেসের মাধ্যমে অর্থাৎ প্যাটার্নটি হবে

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /(Mr\.|mr\.)\s\w+\s/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["Mr. Alu ", "mr. Potol "]

/*Actual Output*/
[ Match 1: "Mr. Alu ", Group1: "Mr."
  Match 2: "Mr. Potol ", Group2: "mr."]

যদিও জাভাস্ক্রিপ্টে match ফাংশন ক্যাপচারিং গ্রুপের মিলগুলো দেখায় না কিন্তু এর আসল ফলাফল হবে Actual Output সেকশনে দেখানো ফলাফলের মতো। আমাদের অনেক সময় ক্যাপচারিং গ্রুপের মিলগুলো দরকার পরে না কিন্তু আমরা শুধু সাব-প্যাটার্ন ব্যবহার করতে চাই, তাহলে প্রথম বন্ধনির পরে ?: দিতে হয় যাকে বলে নন-ক্যাপচারিং গ্রুপ। প্রকৃতপক্ষে জাভাস্ক্রিপ্টে match ফাংশন সুনির্দিষ্ট ভাবে এই নন-ক্যাপচারিং গ্রুপ মুডে কাজ করে। যাই হোক, নন-ক্যাপচারিং মুডে উপরের প্যাটার্নটি হবে

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /(?:Mr\.|mr\.)\s\w+\s/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["Mr. Alu ", "mr. Potol "]

রেগুলার এক্সপ্রেশনে প্রথম বন্ধনি এবং এর ভিতরের সাব-প্যাটার্নের আরো কিছু ব্যবহার আছে। যেমন, কখনো কখনো আমাদের প্রত্যাশিত মিলটি বের করার জন্যে স্ট্রিং-এর সামনে তাকিয়ে দেখতে হয় যে আমরা যেই রকম ম্যাচিং চাচ্ছি সেটা আছে কিনা অর্থাৎ আমরা কন্ডিশনালি পরীক্ষা করে সামনে এগুতে চাই। ধরা যাক, আমরা আমাদের গিনিপিগ স্ট্রিং-এ শিক্ষাবর্ষের প্রথম বছরটি বের করতে চাই, অন্য বছরগুলো নয়।  শিক্ষাবর্ষ মানে দুটি বছর একটি ড্যাশ দিয়ে আলাদা করা যেমন, শিক্ষাবর্ষ 2008-2009 এ আমরা 2008 কে বের করতে চাচ্ছি। তো আমাদের নিশ্চিত হতে হতে যে 2008 এর পরে একটি ড্যাশ এবং ঠিক তার পরে আরেকটি বছর আছে। তার মানে আমরা যদি স্ট্রিং -এ  কোনো বছর পাই তাহলে আমরা সামনে তাকিয়ে দেখবো ঠিক এর পরে কোনো ড্যাশ এবং আরেকটি বছর আছে কিনা কিন্তু এই ড্যাশ এবং বছরটিকে আমরা আমাদের প্রাপ্ত ম্যাচিং বা মিলে চাচ্ছি না। আমরা শুধু দেখতে চাচ্ছি বেটা আছে কি নাই। রেগুলার এক্সপ্রেশনে এই ধরনের শর্ত দিতে হয় প্রথম বন্ধনির পরে ?= দিয়ে যা দেখতে অনেকটা নন-ক্যাপচারিং গ্রুপের মতো যেখানে ?:  পরিবর্তে ?= দিতে হয়। রেগুলার এক্সপ্রেশনে একে বলে লুক-অ্যাহেড (lookahead) । সুতারাং প্যাটার্নটি লিখা যাক

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /\d{4}(?=-\d{4})/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["2008"]

আমরা দেখতে পাচ্ছি আমাদের প্রাপ্ত ফলাফলের ম্যাচিং বা মিলে -2009 নাই কারণ লুকঅ্যাহেড প্যাটার্নটি শুধুই শর্তটি যাচাই করে কিন্তু ফলাফলে প্রাপ্ত ম্যাচিংকে প্রভাবিত করে না। লুকঅ্যাহেডের ঠিক বিপরীত হচ্ছে নেগেটেড লুকঅ্যাহেড (negated lookahead) যা শুরু করতে হয় প্রথম বন্ধনির পরে ?! দিয়ে যা কাজ করে লুক-অ্যাহেডের ঠিক উল্টা নিয়মে। প্রথম বন্ধনির ব্যবহারের একটা তালিকা এক নজরে দেখে নেইঃ

নিয়মনামপ্রাপ্ত ম্যাচিংএ প্রভাব
(PATTERN)ক্যাপচারিং গ্রুপ  হ্যাঁ
(?:PATTERN) নন-ক্যাপচারিং গ্রুপ হ্যাঁ
(?=PATTERN)লুকঅ্যাহেড না
(?!PATTERN)নেগেটেড লুকঅ্যাহেড না

রেগুলার এক্সপ্রেশনে আরও কিছু বিশেষ ক্যারেক্টার আছে যেগুলোও প্রাপ্ত ম্যাচিং এর উপর কোনো প্রভাব না ফেলে কাজ করে যাদেরকে পজিশনিং ক্যারেক্টার বলে। যেমন,  স্ট্রিং-এর শুরু কিংবা শেষ অবস্থান।  উদাহরণস্বরূপ, যদি আমরা আমাদের গিনিপিগ স্ট্রিং-এর  শুরুতে যে Mr. টি আছে শুধু সেটি বের করতে চাই। তাহলে প্যাটার্নটি হবে

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /^Mr./g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["Mr."]

শুরু বুঝাতে বিশেষ ক্যারেক্টারটি হচ্ছে ^ এবং শেষ বুঝাতে বিশেষ ক্যারেক্টারটি হচ্ছে $। অবস্থান সম্পর্কিত আরেকটি বিশেষ নিয়ম হচ্ছে \b যাকে ওয়ার্ড বাউন্ডারি বলে। ওয়ার্ড-বাউন্ডারি হচ্ছে এমন একটি পজিশন বা অবস্থান যেখানে একটি ওয়ার্ড ক্যারেক্টারের ঠিক পরে একটি নন-ওয়ার্ড ক্যারেক্টার থাকে। যেমন, অ্যালফাবেটের পরে স্পেস। শুধু মনে রাখতে হবে কোনো পজিশনিং ক্যারেক্টারই প্রাপ্ত ম্যাচিং-এর উপর প্রভাব ফেলে না।

আমরা মোটামুটি রেগুলার এক্সপ্রেশনের সবগুলা নিয়মই আলোচনা করে ফেলেছি। লেখাটিও শেষ করা দরকার।  একটি বিষয় বলে শেষ করবো। প্রথম লেখায় আমরা যে কোয়ান্টিফায়ারগুলো দেখেছি, সেগুলো সবগুলোই লোভী বা গ্রিডি অর্থাৎ ম্যাচিংটি যতোটা সম্ভব বড় করে। যেমন, 20.* প্যাটার্নটির মানে হচ্ছে 20 এর পরে যেকোনো ক্যারেক্টার অসংখ্য বার থাকবে। এটি যদি আমাদের গিনিপিগ স্ট্রিং-এ প্রয়োগ করি তাহলে প্রাপ্ত ম্যাচিং-এর সংখ্যা হবে একটি এবং ম্যাচিংটি হবে দীর্ঘ 008. They are studying in same university in the session 2008-2009. আমরা চাইলে গ্রিডি থেকে নন-গ্রিডি বা লেজি করে দিতে পারি, তার ফলে প্রাপ্ত ম্যাচিং-এর দৈর্ঘ্য ছোট করে ম্যাচিং-এর সংখ্যা যতগুলো সম্ভব বের করবে। গ্রিডি থেকে নন-গ্রিডি করতে কোয়ান্টিফায়ার ক্যারেক্টারের পরে একটি অতিরিক্ত প্রশ্নবোধক চিহ্ন ? দিতে হবে। যেমন, 20.* এর নন-গ্রিডি রূপ হচ্ছে 20.*?  অনুরুপভাবে, কোয়ান্টিফায়ার ক্যারেক্টার + এর পরে ? বসিয়ে গ্রিডি থেকে নন-গ্রিডি করতে পারি।

/* Greedy mode */
var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /20.*/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["2008. They study at the same university in the session 2008-2009."]

/* Non greedy or lazy mode */
var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /20.*?/g;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
["20", "20", "20"]

অবশেষে সংক্ষিপ্ত রেগুলার এক্সপ্রেশনের লেখাটি শেষ হলো। ধন্যবাদ।

রেগুলার এক্সপ্রেশন -এ শুরু।

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

রেগুলার এক্সপ্রেশন ব্যপারটা কি? সহজ কথায় রেগুলার এক্সপ্রেশন হচ্ছে কতোগুলা প্যাটার্ন বা বর্ণ বিন্যাস যার মাধ্যমে আমরা স্ট্রিং থেকে আমাদের প্রত্যাশিত সাব-স্ট্রিং বা ক্ষুদ্র অক্ষর বিন্যাস খুঁজে বের করতে পারি। কিছু ব্যতিক্রম বাদে মোটামুটি সব প্রোগ্রামিং ভাষায় রেগুলার এক্সপ্রেশনের নিয়মকানুন একই। এই লিখায় আমি মূলত জাভাস্ক্রিপ্ট ব্যবহার করবো। নিচের স্ট্রিং-কে আমরা গিনিপিগ হিসেবে নিলাম।

Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.

প্রথমে উক্ত গিনিপিগ স্ট্রিং-এ কোনো M উপস্থিত আছে কিনা সেটা বের করি। সেটা বের করার জন্যে আমাদের রেগুলার এক্সপ্রেশনের একটা প্যাটার্ন লাগবে যার মাধ্যমে আমরা আমাদের গিনিপিগ স্ট্রিং কে যাচাই করবো।  জাভাস্কিপ্ট-এ রেগুলার এক্সপ্রেশন এক ধরনের অবজেক্ট এবং শুধু দুটি ফরোয়ার্ড স্ল্যাসের অর্থাৎ // মধ্যেই প্যাটার্নটি লিখা যায়। যদিও জাভাস্কিপ্ট-এ আরও কয়েকভাবে প্যাটার্নটি লিখা যায়, আমি ওই সব বিষয়ে বিস্তারিত লিখছি না। আচ্ছা আমি যে বললাম, রেগুলার এক্সপ্রেশন দিয়ে স্ট্রিং-এ আমাদের প্রত্যাশিত সাব-স্ট্রিং খুঁজে বের করা যায় কিন্তু খুঁজে বের করে করবোটা কি? আসলে আমরা অনেক স্ট্রিং অপারেশান-ই  করতে পারি যেমন খুঁজে বের করে সাব-স্ট্রিংকে রিপ্লেস বা পরিবর্তন করতে পারি অথবা শুধু চেক করে দেখতে পারি বেটা আছে কি নাই অথবা খুঁজে বের করে রাখতে পারি পরে কোথাও ব্যবহার করার জন্যে। আমি জাভাস্কিপ্টের ফাংশন match ব্যবহার করবো যার কাজ হছে শেষের কাজটি করা অর্থাৎ খুঁজে বের করে দেওয়া।

রেগুলার এক্সপ্রেশনের গুরুত্বপূর্ণ যে বিষয়টি খেয়াল রাখতে হবে সেটি হচ্ছে এটি কাজ করে ক্যারেক্টার বাই ক্যারেক্টার অর্থাৎ প্যাটার্ন এর যদি প্রথম ক্যারেক্টার-এ মিল পায় তবেই শুধু এর (প্যাটার্নটির) দ্বিতীয় ক্যারেক্টার নিয়ে অগ্রসর হবে অন্যথায় আবার প্যাটার্নটির প্রথম ক্যারেক্টার থেকে শুরু করবে । যেহেতু আমরা শুধু একটি মাত্র ক্যারেক্টার M কে চেক করবো এবং এর আগে পরে কিছু নাই সুতরাং আমাদের প্যাটার্নটি হবে খুবই সহজ অর্থাৎ শুধু M

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /M/;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
 ["M"]

অনুরপভাবে যদি Mr কে বের করতে চাই তবে প্যাটার্নটি হবে Mr অথবা 2008 কে বের করার জন্যে প্যাটার্নটি 2008। যেহেতু ক্যারেক্টার বাই ক্যারেক্টার মিল খুঁজে, তাই Mr প্যাটার্নটির ক্ষেত্রে প্রথমে M কে খুঁজবে, যদি পেয়ে যায় তবে আমাদের গিনিপিগ স্ট্রিং-এ প্যাটার্নটির পরবর্তী ক্যারেক্টার r কে খুঁজবে ঠিক M-এর পরে। যদি মিল পেয়ে যায় তাহলে কাজ শেষ। যদি মিল না পায় তাহলে আবার প্রথম থেকে প্যাটার্নটির M দিয়ে শুরু করবে গিনিপিগ স্ট্রিং-এর বাকি ক্যারেক্টারগুলোকে চেক করার জন্যে এবং এভাবে চলতে থাকে গিনিপিগ স্ট্রিং-এর শেষ ক্যারেক্টার পর্যন্ত।  সাধারণভাবে কিছু বিশেষ ক্যারেক্টারবাদে প্রতিটি ক্যারেক্টারকে লিটার‍্যালি বা আক্ষরিকভাবেই বিবেচনা করা হয় যাদের নিয়ে আমরা ধীরে ধীরে আলোচনা করবো।

আচ্ছা, আমাদের গিনিপিগ স্ট্রিং-এ কোনো বছর আছে কিনা আমরা দেখতে চাই। আমরা ধরে নেই, বছর মানে চারটা সংখ্যা পাশাপাশি থাকবে কিন্তু ক্যারেক্টারটি যে সংখ্যা তা ডিফাইন করবো কিভাবে? খুব সহজ, গণিতে যেই রকম আমরা সেট ব্যবহার করি, ঠিক সেই রকম আমরা ক্যারেক্টার সেট বলে দিতে পারি। যাকে রেগুলার এক্সপ্রেশন-এ ক্যারেক্টার সেট বা ক্যারেক্টার ক্লাস বলে। ক্যারেক্টার সেট ডিক্লায়ের করার নিয়ম হলো স্কোয়ার অর্থাৎ [] বন্ধনীর ভিতরে প্রয়োজনীয় ক্যারেক্টারগুলো দিয়ে দেয়া। যেমন,  [0123456789] মানে সংখ্যার সেট, BCDEF] হলো ABCDEF-এর সেট। চাইলে আমরা রেঞ্জ দিয়ে সংক্ষেপে লিখেতে পারি। রেঞ্জ বুঝানোর জন্যে ড্যাশ (-) ব্যবহার করা হয়। যেমন, [0-9] মানে সংখ্যার সেট যা [0123456789] এর অনুরুপ অথবা -zA-Z] মানে ইংরেজি অ্যালফাবেটের সেট। সেপারেটর হিসেবে কমা দেবার প্রয়োজন নাই। আবার নেগেটিভ সেটও তৈরি করা যায় শুরুতে একটা ^ বসিয়ে দিয়ে। যেমন, [^0-9] মানে সংখ্যা বাদে সকল কিছুর সেট।

শুধু মনে রাখতে হবে রেগুলার এক্সপ্রেশন-এ সেটটি একটি একক ক্যারেক্টার হিসেবে বিবেচনা করা হবে অর্থাৎ ক্যারেক্টার সেট মূলত অন্যান্য সাধারণ ক্যারেক্টার মতই জায়গা দখল করবে। তো বের করে ফেলি আমাদের বছর বের করার প্যাটার্ন। আমাদের দরকার পর পর চারটা সংখ্যা অর্থাৎ আমাদের সংখ্যার সেটটি পর পর চার বার দিলেই হবে। তার মানে প্যাটার্নটি হলো  [0-9][0-9][0-9][0-9]

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009..';
var pattern = /[0-9][0-9][0-9][0-9]/;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
 ["2008"]

উপড়ের প্যাটার্নটিতে কিসের যেন অভাব!  একই জিনিষ চারবার করে লিখা, দেখতে ভালো লাগছে না। একটু ঘষামাজা করা দরকার আর ঘষামাজা করার জন্যে যা লাগবে, তাকে রেগুলার এক্সপ্রেশন -এ বলে কোয়ান্টিফায়ার। এই কোয়ান্টিফায়ার হচ্ছে কতগুলো স্পেশাল ক্যারেক্টার যা দিয়ে আমরা একই জিনিস বার বার না লিখে তার পরিবর্তে কোয়ান্টিফায়ার ক্যারেক্টার দিয়ে দিতে পারি। যেমন, * মানে ০ থেকে অগণিত, + মানে ১ থেকে অগণিত, ? মানে ০ থেকে ১ ইত্যাদি। আবার আমরা চাইলে নিজেরাও রেঞ্জের মান বলে দিতে পারি। রেঞ্জের মান ডিফাইন করার নিয়ম হচ্ছে কারলি অর্থাৎ {} ব্রাকেটের মধ্যে শুরু ও শেষ বলে দেয়া। যেমন, {0,4} মানে হচ্ছে ০ থেকে চার, {1,5} মানে হচ্ছে ১ থেকে পাঁচ ইত্যাদি। মজার ব্যপার হচ্ছে রেঞ্জের শেষের মান না দিলে তার মান হবে অগণিত। যেমন, {0,} মানে হচ্ছে ০ থেকে অগণিত। আবার যদি রেঞ্জ না দিয়ে শুধুমাত্র একটি মান দেই তাহলে তার মানে দাড়ায় ঠিক ততটা। যেমন, {2} মানে হচ্ছে ঠিক দুইটা। প্রকৃতপক্ষে কোয়ান্টিফায়ার ক্যারেক্টারগুলো অর্থাৎ *,+,? কোয়ান্টিফায়ার রেঞ্জের সংক্ষিপ্তরূপ। যেমন, {1,} এর সমান হচ্ছে + আবার {o,} এর সমান হচ্ছে *। নিচের কোয়ান্টিফায়ারের তালিকাটি খেয়াল করলে আরও পরিস্কার বোঝা যাবেঃ

কোয়ান্টিফায়ারমানবিকল্প
*০ থেকে অগণিত {0,}
+১ থেকে অগণিত {1,}
?০ থেকে ১ অর্থাৎ থাকতে পারে আবার নাও পারে{০,1}
{1,5}১ থেকে পাঁচ 
{5}ঠিক পাঁচটা 

এবার তাহলে কোয়ান্টিফায়ার ব্যবহার করে বছর বের করার প্যাটার্নটি লিখা যাক যা দেখতে আগের চেয়ে অনেক ভাল লাগবে।

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /[0-9]{4}/;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
 ["2008"]

আমি জানি এখন একটি ব্যাপার অনেকের মাথায় ঘুরছে সেটা হলো যদি বিল্ট-ইন কোয়ান্টিফায়ারের সংক্ষিপ্তরূপ মানে * ,+ ইত্যাদি থাকে, তাহলে বিল্ট-ইন ক্যারেক্টার সেট বা ক্যারেক্টার ক্লাস থাকা উচিত কেননা সংখ্যার সেট বা অ্যালফাবেটিক  সেট এরকম কিছু সেট আছে যেগুলা আগে থেকেই নির্দিষ্ট। তাদের ধারনা একদম ঠিক, কোয়ান্টিফায়ারের মতো কিছু বিল্ট-ইন ক্যারেক্টার সেট আছে যা শুরু হয় ব্যাকওয়ার্ড স্লাস অর্থাৎ \।  যেমন, \d মানে সংখ্যার সেট, \w মানে অ্যালফাবেটিক ও আন্ডারস্কোর (_) এর সেট ইত্যাদি। নিচের একটি সংক্ষিপ্ত তালিকা দিয়ে দিলামঃ

ক্যারেক্টার সেটক্যারেক্টারসমূহবিকল্প
\dসকল সংখ্যা [0-9]
\D সংখ্যা বাদে সকল কিছুর সেট [^0-9]
\wঅ্যালফাবেটিক ও আন্ডারস্কোর (_) এর সেট [a-zA-Z_]
\Wঅ্যালফাবেটিক ও আন্ডারস্কোর (_) বাদে সেট [^a-zA-Z_]
\s হোয়াইট স্পেস ক্যারেক্টারসমূহ যেমন স্পেস, ট্যাব 
\Sহোয়াইট স্পেস বাদে সকল কিছুর সেট 
 \tশুধু ট্যাব এর সেট 

বিল্ট-ইন ক্যারেক্টার সেট ব্যবহার করে এখন আমরা আমদের বছর বের করার প্যাটার্নটি আরও স্মার্ট ও সংক্ষিপ্ত করে ফেলি যা হবে নিম্নরূপঃ

var str = 'Mr. Alu and mr. Potol are friends since 2008. They study at the same university in the session 2008-2009.';
var pattern = /\d{4}/;
var matches = str.match(pattern);
console.log(matches);

/* Output in console*/
 ["2008"]

লেখাটি আর সংক্ষেপ থাকছে না তাই এখানেই শেষ করছি। এখনো রেগুলার এক্সপ্রেশনের আরও কিছু জিনিস বাকি আছে যেমন, গ্রিডি/নন-গ্রিডি কোয়ান্টিফায়ার, মডিফায়ার, ক্যাপচারিং গ্রুপ, লুক অ্যাহেড এবং কিছু পজিশনিং ক্যারেক্টার যা পরবর্তী লেখাতে আলোচনা করবো। তবে শেষ করবো একটি বিশেষ ক্যারেক্টার দিয়ে, যেটি হচ্ছে ডট (.)। রেগুলার এক্সপ্রেশনে ডট মানে বুঝায় নতুন লাইন বাদে যেকোনো ক্যারেক্টার । যেমন, a. মানে, a এর পরে যেকোনো একটি ক্যারেক্টার বুঝায়।  তাহলে .* দিয়ে কি বুঝায় তা ভাবতে দিয়ে আমি বিদায় নিলাম।

দ্বিতীয় পর্বের লিঙ্ক