نتایج تطبیق بهتر با String.prototype.matchAll()

جو مدلی
Joe Medley

کروم 73 متد String.prototype.matchAll() را معرفی می کند. رفتاری مشابه با match() دارد، اما یک تکرار کننده را با تمام تطابقات عبارات منظم در یک عبارت منظم جهانی یا چسبنده برمی گرداند. این یک راه ساده برای تکرار بیش از مسابقات، به خصوص زمانی که نیاز به دسترسی به گروه‌های عکسبرداری دارید، ارائه می‌کند.

مشکل () 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() برای عبارات منظم غیرکلی برگردانده شده است.

مواد جایزه

این عمدتاً برای افرادی است که تازه وارد عبارات منظم هستند یا در آن متخصص نیستند. ممکن است متوجه شده باشید که نتایج هر دو match() و matchAll() (برای هر تکرار) آرایه هایی با برخی ویژگی های نامگذاری شده اضافی هستند. در حین تهیه این مقاله، متوجه شدم که این ویژگی‌ها دارای نقص‌هایی در اسناد MDN هستند (که من آن را برطرف کردم ). در اینجا یک توضیح سریع است.

index
شاخص اولین نتیجه در رشته اصلی. در مثال بالا test2 از موقعیت 5 شروع می شود، بنابراین index دارای مقدار 5 است.
input
رشته کاملی که matchAll() با آن اجرا شد. در مثال من، 'test1test2' بود.
groups
حاوی نتایج هر گروه ثبت نامی است که در عبارت منظم شما مشخص شده است.

نتیجه

اگر چیزی را از دست دادم لطفاً در نظرات زیر به من اطلاع دهید. می‌توانید درباره تغییرات اخیر جاوا اسکریپت در به‌روزرسانی‌های قبلی یا در وب‌سایت V8 اطلاعات بیشتری کسب کنید.