Skip to content

Latest commit

 

History

History
99 lines (62 loc) · 7.71 KB

File metadata and controls

99 lines (62 loc) · 7.71 KB

এস্কেপিং, স্পেশাল ক্যারাক্টার

আমরা দেখেছি, ব্যকস্ল্যাশ pattern:\ বিভিন্ন ক্যারাক্টার ক্লাস বুঝাতে ব্যবহার করা হয়, যেমন pattern:\d। তাই এটি রেগুলার এক্সপ্রেশনের একটি স্পেশাল ক্যারাক্টার (স্ট্রিংয়ের মত)।

এছাড়াও আরো কিছু স্পেশাল ক্যারাক্টার আছে, যা রেগুলার এক্সপ্রেশনে ভিন্ন অর্থ বুঝায়। এদের সাহায্যে বিভিন্ন জটিল প্যাটার্ন আমরা খুঁজতে পারি। এদের সম্পূর্ন তালিকাটি হল: pattern:[ \ ^ $ . | ? * + ( )

তালিকাটি আপনার মুখস্ত করার দরকার নেই -- খুব তাড়াতাড়ি আমরা প্রত্যেকটি স্পেশাল ক্লাস সম্পর্কে বিস্তারিত জানব, আর তখন আমরা অটোমেটিক প্রত্যেকটি ক্যারাক্টার শিখে যাব।

এস্কেপিং

মনে করুন আমরা একটি ডট খুঁজে পেতে চাই। "যেকোন ক্যারাক্টার" নয় শুধু ডট(যেহেতু রেগুলার এক্সপ্রেশনে ডট দ্বারা যেকোন ক্যারাক্টার বুঝায়)।

স্পেশাল ক্যারাক্টার সমূহকে রেগুলার ক্যারাক্টারের মত ব্যবহার করতে চাইলে এর পূর্বে একটি ব্যাকস্ল্যাশ যুক্ত করতে হবে: pattern:\.

একে বলা হয় "ক্যারাক্টার এস্কেপিং"।

যেমন:

alert( "Chapter 5.1".match(/\d\.\d/) ); // 5.1 (match!)
alert( "Chapter 511".match(/\d\.\d/) ); // null (এখানে ডট খুঁজা হচ্ছে \.)

প্রথম বন্ধনীও স্পেশাল ক্যারাক্টার, তো যদি আমরা এদের খুঁজতে চাই, আমাদের এভাবে লিখা উচিত pattern:\(। নিচের উদাহরণটিতে দেখুন আমরা "g()" কে খুঁজে পেতে চাই:

alert( "function g()".match(/g\(\)/) ); // "g()"

যদি আমরা ব্যাকস্ল্যাশ \ খুঁজে পেতে চাই, রেগুলার এক্সপ্রেশন এবং রেগুলার স্ট্রিং উভয়ের মধ্যেই এটি একটি স্পেশাল ক্যারাক্টার, তো ব্যাকস্ল্যাশের জন্য আমাদের দুটি ব্যাকস্ল্যাশ দিতে হবে।

alert( "1\\2".match(/\\/) ); // '\'

স্ল্যাশ

যদিও স্ল্যাশ চিহ্ন '/' কোন স্পেশাল ক্যারাক্টার না, কিন্তু জাভাস্ক্রিপ্টে এটি দ্বারা রেগুলার এক্সপ্রেশন বুঝায়: pattern:/...pattern.../, তাই আমাদের এদেরও স্কেপ করার প্রয়োজন হতে পারে।

আমরা এভাবে স্ল্যাশ '/' খুঁজতে পারি:

alert( "/".match(/\//) ); // '/'

আবার যখন আমরা এভাবে প্যাটার্ন pattern:/.../ তৈরির বদলে new RegExp দিয়ে প্যাটার্ন বানাব, তখন আমাদের এটি স্কেপ করা লাগবে না:

alert( "/".match(new RegExp("/")) ); // finds /

new RegExp

যদি আমরা new RegExp এর মাধ্যমে রেগুলার এক্সপ্রেশন তৈরি করি, আমাদের স্ল্যাশ / কে স্কেপ করা লাগবে না, কিন্তু অন্যান্য স্পেশাল ক্যারাক্টারকে স্কেপ করা লাগবে।

উদাহরণস্বরূপ, এটি দেখুন:

let regexp = new RegExp("\d\.\d");

alert( "Chapter 5.1".match(regexp) ); // null

এই প্যাটার্নটি pattern:/\d\.\d/ আগের উদাহরণে কাজ করছিল, কিন্তু new RegExp("\d\.\d") এর সাথে কাজ করছে না কেন?

কেননা রেগুলার স্ট্রিংয়ে ব্যাকস্ল্যাশ "নিজস্ব স্পেশাল ক্যারাক্টারের" জন্য ব্যবহৃত হয় যেমন \n, এখানে ব্যাকস্ল্যাশ এস্কেপিংয়ের জন্য ব্যবহৃত হয়।

এখানে দেখুন "\d.\d" এর আউটপুট কি দেখায়:

alert("\d\.\d"); // d.d

স্ট্রিংয়ে ব্যাকস্ল্যাশ স্পেশাল কিছু ক্যারাক্টারের জন্য ব্যবহৃত হয়, উদাহরণস্বরূপ:

  • \n -- নিউলাইন ক্যারাক্টার বুঝায়,
  • \u1234 -- ইউনিকোড বুঝায়,
  • ...এবং যখন কোন বিশেষ ক্যারাক্টার বুঝায় না: যেমন pattern:\d বা \z, তখন ব্যাকস্ল্যাশ ক্যারাক্টারটি রিমুভ হয়ে যায়।

সুতরাং new RegExp স্ট্রিং হতে ব্যাকস্ল্যাশ রিমুভ হয়ে যায়। এজন্য সার্চ কাজ করে না!

এটি ফিক্স করতে আমাদের দুটি ব্যাকস্ল্যাশ ব্যবহার করতে হবে, কেননা \\ এটির আউটপুট হবে \:

*!*
let regStr = "\\d\\.\\d";
*/!*
alert(regStr); // \d\.\d (এখন ঠিক আছে)

let regexp = new RegExp(regStr);

alert( "Chapter 5.1".match(regexp) ); // 5.1

সারাংশ

  • সাধারণত স্পেশাল ক্যারাক্টারসমূহ সার্চ করতে pattern:[ \ ^ $ . | ? * + ( ) আমাদের ব্যাকস্ল্যাশ \ দ্বারা ("এস্কেপের জন্য") প্রিপেন্ড করে নিতে হবে।
  • যদি pattern:/.../ এভাবে প্যাটার্ন ডিক্লেয়ার করি আমাদের / কেও এস্কেপ করে নিতে হবে (তবে new RegExp এ না)।
  • যখন প্যাটার্নটি new RegExp এর মাধ্যমে ডিক্লেয়ার করা হবে, আমাদের দুটি ব্যাকস্ল্যাশ \\ ব্যবহার করতে হবে, কেননা স্ট্রিংয়ে এটিকে একটি হিসেবে বিবেচনা করা হবে।