نتائج مطابقة أفضل باستخدام String.prototype.matchAll()

Joe Medley
Joe Medley

يقدِّم Chrome 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
يحتوي على نتائج أي مجموعات التقاط مُسَمّاة تم تحديدها في التعبير العادي.

الخلاصة

إذا فاتني أي شيء، يُرجى إبلاغي به في التعليقات أدناه. يمكنك الاطّلاع على المزيد من المعلومات حول التغييرات الأخيرة التي طرأت على JavaScript في التحديثات السابقة أو على موقع V8 الإلكتروني.