String.prototype.matchAll() এর সাথে আরও ভাল ম্যাচ ফলাফল

জো মেডলি
Joe Medley

Chrome 73 String.prototype.matchAll() পদ্ধতি চালু করেছে। এটি match() এর অনুরূপ আচরণ করে, কিন্তু একটি বিশ্বব্যাপী বা স্টিকি রেগুলার এক্সপ্রেশনে সমস্ত রেগুলার এক্সপ্রেশন ম্যাচ সহ একটি পুনরাবৃত্তিকারী প্রদান করে। এটি ম্যাচের উপর পুনরাবৃত্তি করার একটি সহজ উপায় অফার করে, বিশেষ করে যখন আপনার গ্রুপ ক্যাপচারে অ্যাক্সেসের প্রয়োজন হয়।

ম্যাচ() এর সাথে কি সমস্যা?

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

const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const results = string.match(regex);
console.log(results);
// → ['test1', 'test2']

এটি একটি কনসোলে চালান এবং লক্ষ্য করুন যে এটি 'test1' এবং 'test2' স্ট্রিং ধারণকারী একটি অ্যারে প্রদান করে। আমি যদি রেগুলার এক্সপ্রেশন থেকে g পতাকাটি সরিয়ে ফেলি তবে আমি যা পাই তা আমার সমস্ত ক্যাপচারিং গ্রুপে আছে, কিন্তু আমি শুধুমাত্র প্রথম ম্যাচটি পাই। এটি এই মত দেখায়:

['test1', 'e', 'st1', '2', index: 0, input: 'test1test2', groups: undefined]

এই স্ট্রিংটিতে 'test2' দিয়ে শুরু হওয়া একটি দ্বিতীয় সম্ভাব্য ম্যাচ রয়েছে কিন্তু আমার কাছে এটি নেই। এখন এখানে ধাঁধা: আমি কিভাবে প্রতিটি ম্যাচের জন্য সমস্ত ক্যাপচারিং গ্রুপ পেতে পারি? String.prototype.matchAll() প্রস্তাবের ব্যাখ্যাকারী দুটি সম্ভাব্য পন্থা দেখায়। আমি তাদের বর্ণনা করব না কারণ আশা করি আপনার আর বেশি দিন প্রয়োজন হবে না।

String.prototype.matchAll()

matchAll() এর সাথে ব্যাখ্যাকারী উদাহরণগুলি কেমন দেখাবে? দেখে নিন।

const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const matches = string.matchAll(regex);
for (const match of matches) {
  console.log(match);
}

এই বিষয়ে লক্ষ করার মতো কয়েকটি বিষয় রয়েছে। match() এর বিপরীতে যা একটি বিশ্বব্যাপী অনুসন্ধানে একটি অ্যারে প্রদান করে, matchAll() একটি পুনরাবৃত্তিকারী প্রদান করে যা লুপগুলির for...of সাথে সুন্দরভাবে কাজ করে। পুনরাবৃত্তিকারী প্রতিটি ম্যাচের জন্য একটি অ্যারে তৈরি করে, যার মধ্যে কয়েকটি অতিরিক্ত সহ ক্যাপচারিং গ্রুপ রয়েছে। আপনি যদি এগুলিকে কনসোলে প্রিন্ট করেন তবে সেগুলি এইরকম দেখাবে:

['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', groups: undefined]
['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', groups: undefined]

আপনি লক্ষ্য করতে পারেন যে প্রতিটি ম্যাচের মানটি অ-গ্লোবাল রেগুলার এক্সপ্রেশনের জন্য match() দ্বারা প্রত্যাবর্তিত ঠিক একই বিন্যাসে একটি অ্যারে।

বোনাস উপাদান

এটি মূলত তাদের জন্য যারা নিয়মিত অভিব্যক্তিতে নতুন বা যারা এতে বিশেষজ্ঞ নন। আপনি হয়তো লক্ষ্য করেছেন ম্যাচ() এবং matchAll() (প্রতিটি পুনরাবৃত্তির জন্য) উভয়ের ফলাফলই কিছু অতিরিক্ত নামযুক্ত বৈশিষ্ট্য সহ অ্যারে। এই নিবন্ধটি প্রস্তুত করার সময়, আমি লক্ষ্য করেছি যে এই বৈশিষ্ট্যগুলির MDN-এ কিছু ডকুমেন্টেশন ঘাটতি রয়েছে (যা আমি ঠিক করেছি )। এখানে একটি দ্রুত বিবরণ আছে.

index
মূল স্ট্রিং-এ প্রথম ফলাফলের সূচক। উপরের উদাহরণে test2 পজিশন 5 থেকে শুরু হয় তাই index মান 5 আছে।
input
সম্পূর্ণ স্ট্রিং যা matchAll() এর সাথে মিলেছে। আমার উদাহরণে, এটি ছিল 'test1test2'
groups
আপনার রেগুলার এক্সপ্রেশনে নির্দিষ্ট করা কোনো নামধারী ক্যাপচারিং গ্রুপের ফলাফল ধারণ করে।

উপসংহার

আমি যদি কিছু মিস করে থাকি তাহলে নিচের মন্তব্যে আমাকে জানান। আপনি জাভাস্ক্রিপ্টের সাম্প্রতিক পরিবর্তনগুলি সম্পর্কে পূর্ববর্তী আপডেটে বা V8 ওয়েবসাইটে পড়তে পারেন।