একটি প্রাক্টিক্যাল টাস্কের কথা চিন্তা করুন -- আমাদের এই ধরণের "+7(903)-123-45-67"
একটি নাম্বার আছে, এখন আমাদের এটিকে এই ধরণের 79035419441
নাম্বারে পরিবর্তন করতে হবে।
তো আমাদের এটি করতে যেসব ক্যারেক্টার "ডিজিট বা অঙ্ক" নয় তাদের বাদ দিতে হবে। ক্যারেক্টার ক্লাসের সাহায্যে আমরা এটি করতে পারি।
ক্যারেক্টার ক্লাস হল একটি বিশেষ চিহ্ন বা বর্ণ যা দ্বারা কোন একটি নির্দিষ্ট সেটের যেকোন সিম্বলকে নির্দেশ করে।
শুরুতে, চলুন "ডিজিট" ক্লাস সম্পর্কে জানি। এটি লিখা হয় pattern:\d
দিয়ে এবং এটি যেকোন "একক ডিজিট বা অঙ্কের" সাথে মিলে।
উদাহরণস্বরূপ, চলুন ফোন নম্বরটিতে প্রথমে ডিজিটটি খুঁজি:
let str = "+7(903)-123-45-67";
let regexp = /\d/;
alert( str.match(regexp) ); // 7
pattern:g
ফ্ল্যাগটি ছাড়া, রেগুলার এক্সপ্রেশনটি শুধু প্রথম মিলটি খুঁজে, এখানে প্রথম ডিজিটের প্যাটার্ন হল pattern:\d
।
এখন চলুন সব ডিজিটের জন্য ফ্ল্যাগ pattern:g
ব্যবহার করি:
let str = "+7(903)-123-45-67";
let regexp = /\d/g;
alert( str.match(regexp) ); // মিলকৃত অঙ্কগুলো অ্যারে আকারে রিটার্ন করেঃ 7,9,0,3,1,2,3,4,5,6,7
// চলুন শুধু ডিজিটগুলো দিয়ে ফোন নাম্বারটি তৈরি করিঃ
alert( str.match(regexp).join('') ); // 79035419441
এই ক্যারাক্টার ক্লাসটি শুধু ডিজিটের জন্য। অন্যান্য ক্যারাক্টারগুলোর জন্যও এই ধরণের ক্লাস আছে।
সর্বাধিক ব্যবহৃত ক্লাশগুলো হল:
pattern:\d
("d" দ্বারা বুঝায় "digit" বা অঙ্ক)
: "digit" বা অঙ্ক হল: 0
to 9
পর্যন্ত অঙ্কগুলো।
pattern:\s
("s" দ্বারা বুঝায় "space")
: স্পেস সিম্বল হল: স্পেসসহ, ট্যাব \t
, নিউলাইন \n
এছাড়াও কিছু বিরল ক্যারেক্টার আছে, যেমন: \v
, \f
এবং \r
।
pattern:\w
("w" দ্বারা বুঝায় "word" বা বর্ণ)
: "wordly" ক্যারেক্টার হল: লাতিন বর্ণমালার বর্ণ বা অঙ্ক বা আন্ডারস্কোর _
। নন-লাতিন বর্ণ (যেমন হিন্দি বা বাংলা) বর্ণগুলো pattern:\w
দ্বারা বুঝায় না।
উদাহরণস্বরূপ, pattern:\d\s\w
দ্বারা বুঝায় একটি "অঙ্ক" একটি "স্পেস ক্যারেক্টার" একটি "বর্ণ ক্যারাক্টার" যেমন: match:1 a
।
রেগুলার এক্সপ্রেশনে রেগুলার সিম্বল এবং ক্যারেক্টার ক্লাসের সিম্বল একসাথে থাকতে পারে।
উদাহরণস্বরূপ, pattern:CSS\d
এই প্যাটার্নটি match:CSS
এবং একটি ডিজিটদ্বারা গঠিত স্ট্রিংয়ের সাথে মিলেঃ
let str = "Is there CSS4?";
let regexp = /CSS\d/
alert( str.match(regexp) ); // CSS4
একইভাবে আমরা অনেক ক্যারেক্টার ক্লাসের মাধ্যমেও চেক করতে পারি:
alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
মিলটিতে (প্রতিটি রেগুলার এক্সপ্রেশন ক্যারেক্টার ক্লাস রেজাল্টের ক্যারেক্টারগুলোর সাথে মিলে):
প্রতিটি ক্যারেক্টার ক্লাসের আবার একটি "ইনভার্স ক্লাস" আছে, তবে এদের বড় হাতের অক্ষর দিয়ে প্রকাশ করা হয়।
ইনভার্স ক্লাস দ্বারা বুঝানো হয় এটি দ্বারা অন্যান্য ক্যারেক্টার গুলোর সাথে মিলবে, উদাহরণস্বরূপ:
pattern:\D
: নন-ডিজিট: pattern:\d
বাদে অন্যান্য ক্যারেক্টার। উদাহরণস্বরূপ, বর্ণমালা।
pattern:\S
: নন-স্পেস: pattern:\s
বাদে অন্যান্য ক্যারেক্টার। উদাহরণস্বরূপ, বর্ণমালা।
pattern:\W
: নন-ওয়ার্ডলি ক্যারাক্টার: pattern:\w
বাদে অন্যান্য ক্যারেক্টার, যেমন: লাতিন বর্ণমালা বা স্পেস বাদে অন্যান্যসমূহ।
এই অধ্যায়ের শুরুতে আমরা দেখেছি কিভাবে স্ট্রিং হতে শুধু ফোন নাম্বার পেতে পারি যেমন: subject:+7(903)-123-45-67
এখানে সব ডিজিট খুঁজে তাদের একত্র করা।
let str = "+7(903)-123-45-67";
alert( str.match(/\d/g).join('') ); // 79031234567
এর পরিবর্তে, আমরা আরো সংক্ষিপ্তভাবে সকল নন-ডিজিট pattern:\D
নাম্বারগুলোকে বাদ দিয়েও এটি করতে পারি:
let str = "+7(903)-123-45-67";
alert( str.replace(/\D/g, "") ); // 79031234567
ডট pattern:.
হল একটি বিশেষ ক্যারেক্টার যা দ্বারা নিউলাইন \n
ব্যতীত সকল ক্লাসকে বুঝার।
উদাহরণস্বরূপ:
alert( "Z".match(/./) ); // Z
রেগুলার এক্সপ্রেশনের মধ্যের কোন ক্যারেক্টারকে বুঝাতে:
let regexp = /CS.4/;
alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (স্পেসও একটি ক্যারাক্টার)
অনুগ্রহ করে মনে রাখবেন যদিও ডট দ্বারা "যেকোন ক্যারেক্টার" বুঝায়, কিন্ত "ক্যারাক্টারের অনুপস্থিতি বা শূণ্যস্থান" কে বুঝায় না। মিলের জন্য অবশ্যই একটি ক্যারেক্টার থাকা লাগবে:
alert( "CS4".match(/CS.4/) ); // null, কেননা ডট দ্বারা বুঝাতে কোন ক্যারেক্টার নাই
ডিফল্টভাবে ডট নিউলাইন ক্যারেক্টারের \n
সাথে মিলেনা।
উদাহরণস্বরূপ, pattern:A.B
এই রেগুলার এক্সপ্রেশটি প্রথমে match:A
এবং match:B
এর মাঝে নিউলাইন \n
ব্যতীত অন্য কোন ক্যারেক্টার থাকলে মিলবে:
alert( "A\nB".match(/A.B/) ); // null (no match)
অনেক সময় আমাদের ডট দ্বারা নিউলাইনসহ যেকোন ক্যারেক্টারকে বুঝাতে হয়।
pattern:s
ফ্ল্যাগের সাহায্যে এটি আমরা করতে পারি। যদি রেগুলার এক্সপ্রেশনে এটি থাকে তাহলে ডট pattern:.
যেকোন ক্যারেক্টারের সাথে মিলে:
alert( "A\nB".match(/A.B/s) ); // A\nB (match!)
বর্তমানে যেসব ব্রাউজারে সাপোর্ট করে তা চেক করুন <https://caniuse.com/#search=dotall>। এই লিখাটি লিখার সময় এটি Firefox, IE, Edge এ কাজ করে না।
সৌভাগ্যক্রমে, অন্য একটি উপায় আছে, যা সব জায়গায় কাজ করে।
আমরা রেগুলার এক্সপ্রেশনে এভাবেও `pattern:[\s\S]` ব্যবহার করতে পারি যা "যেকোন ক্যারেক্টারের " সাথে মিলে।
```js run
alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (match!)
```
`pattern:[\s\S]`-টি দ্বারা আক্ষরিক অর্থে বুঝানো হচ্ছে "একটি স্পেস ক্যারেক্টার অথবা স্পেস ক্যারেক্টার নয়"। অন্য অর্থে, "যেকোন কিছু"। এর পরিবর্তে আমরা এভাবেও করতে পারি `pattern:[\d\D]`।
ট্রিকটি সবখানে কাজ করবে। এছাড়াও যদি আমরা এই ফ্ল্যাগটি `pattern:s` ছাড়া ব্যবহার করতে চাই তাও কাজ করবে।
সাধারণত আমাদের স্পেস ব্যবহারের সতর্কতা অবলম্বন করা প্রয়োজন। যেমন `subject:1-5` এবং `subject:1 - 5` স্ট্রিং দুটি প্রায় একই।
কিন্তু যদি রেগুলার এক্সপ্রেশনে আমরা স্পেস এর ব্যাপারে খেয়াল না করি, এটি কাজ করবে না।
চলুন হাইফেন দ্বারা আলাদা ডিজিটগুলো খুঁজার চেষ্টা করি:
```js run
alert( "1 - 5".match(/\d-\d/) ); // null, মিল পাবেনা!
```
স্পেসযুক্ত করে রেগুলার এক্সপ্রেশনটি ঠিক করি `pattern:\d - \d`:
```js run
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, এখন এটি কাজ করবে
// অথবা আমরা \s ক্লাসটিও ব্যবহার করতে পারি:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, এটিও কাজ করবে
```
**স্পেসও একটি ক্যারেক্টার। এটি অন্যান্য ক্যারেক্টারের মত গুরুত্বপূর্ণ।**
রেগুলার এক্সপ্রেশনে স্পেস যোগ বা বাদ দিয়ে সঠিকভাবে কাজ করবে আমরা এই আশা করতে পারিনা।
অন্য অর্থে বলা যায়, রেগুলার এক্সপ্রেশনে স্পেসসহ প্রতিটি ক্যারেক্টার তাৎপর্যপূর্ণ।
রেগুলার এক্সপ্রেশনে নিম্নোক্ত ক্যারেক্টার ক্লাসগুলো আছে:
pattern:\d
-- ডিজিট বা অঙ্ক।pattern:\D
-- নন-ডিজিট বা অঙ্ক ব্যতীত অন্যান্য ক্যারাক্টার।pattern:\s
-- স্পেস, ট্যাব, নিউলাইন।pattern:\S
--pattern:\s
ব্যতীত বাকীসব।pattern:\w
-- লাতিন বর্ণমালা, অঙ্ক, আন্ডারস্কোর'_'
।pattern:\W
--pattern:\w
ব্যতীত বাকীসব।pattern:.
-- যেকোন ক্যারাক্টার যদি's'
ফ্ল্যাগ থাকে, অন্যথায় নিউলাইন\n
ব্যতীত বাকীসব।
...কিন্ত এখানেই শেষ নয়!
ইউনিকোড এনকোডিং, জাভাস্ক্রিপ্টে স্ট্রিংয়ে অন্যান্য বিভিন্ন ক্যারেক্টার যেমনঃ অন্যান্য ভাষার বর্ণ বা চিহ্ন ইত্যাদি ব্যবহৃত হয়।
আমরা এই ধরণের প্রোপার্টিগুলো দ্বারাও সার্চ করতে পারি। এজন্য এই ফ্ল্যাগটি pattern:u
প্রয়োজন, যা পরবর্তী অনুচ্ছেদে আমরা জানব।