String.prototype.matchAll() ile daha iyi sonuçlar eşleştirme

Joe Medley
Joe Medley

Chrome 73'te String.prototype.matchAll() yöntemi kullanıma sunulmuştur. match() işlevine benzer şekilde çalışır ancak genel veya yapışkan normal ifadedeki tüm normal ifade eşleşmelerini içeren bir iteratör döndürür. Bu, özellikle yakalama gruplarına erişmeniz gerektiğinde eşleşmeleri iteratif olarak incelemenin basit bir yolunu sunar.

match() işleviyle ilgili sorun nedir?

Yakalama gruplarıyla genel eşleşmeleri döndürmeye çalışmıyorsanız kısaca yanıt vermek gerekirse hiçbir şey. Size bir programlama bulmacası sunuyoruz. Aşağıdaki kodu inceleyin:

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

Bunu bir konsolda çalıştırın ve 'test1' ile 'test2' dizelerini içeren bir dizi döndürdüğünü fark edin. Normal ifadeden g işaretini kaldırırsam yakalama gruplarımın tümü yerine yalnızca ilk eşleşmeyi alıyorum. Bu uzantı aşağıdaki gibi görünür:

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

Bu dize, 'test2' ile başlayan ikinci bir olası eşleşme içeriyor ancak bu eşleşmeye sahip değilim. Şimdi bulmacayı çözelim: Her eşleşme için tüm yakalama gruplarını nasıl elde edebilirim? String.prototype.matchAll() önerisinin açıklamalı bölümünde iki olası yaklaşım gösterilmektedir. Umarım bu bilgilere daha fazla ihtiyaç duymazsınız.

String.prototype.matchAll()

matchAll() ile açıklama örnekleri nasıl görünür? Bir bakın.

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

Bu konuda dikkat etmeniz gereken birkaç nokta vardır. Küresel aramada dizi döndüren match()'ün aksine matchAll(), for...of döngüleriyle mükemmel şekilde çalışan bir iteratör döndürür. Döngüleyici, yakalama grupları da dahil olmak üzere her eşleşme için birkaç ekstra içeren bir dizi oluşturur. Bunları konsola yazdırırsanız aşağıdaki gibi görünür:

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

Her eşleşmenin değerinin, küresel olmayan normal ifadeler için match() tarafından döndürülen değerle tam olarak aynı biçimde bir dizi olduğunu fark edebilirsiniz.

Bonus materyal

Bu makale, düzenli ifadelere yeni başlayan veya bu konuda uzman olmayan kullanıcılar için hazırlanmıştır. Hem match() hem de matchAll() işlevinin sonuçlarının (her iterasyon için) bazı ek adlandırılmış özelliklere sahip diziler olduğunu fark etmiş olabilirsiniz. Bu makaleyi hazırlarken, bu mülklerin MDN'de bazı doküman eksiklikleri olduğunu fark ettim (bu eksiklikleri düzelttim). Aşağıda kısa bir açıklama verilmiştir.

index
Orijinal dizede ilk sonucun dizini. Yukarıdaki örnekte test2 5. konumda başlar, bu nedenle index 5 değerine sahiptir.
input
matchAll() işlevinin çalıştırıldığı dizenin tamamı. Örneğimizde bu değer 'test1test2' idi.
groups
Normal ifadenizde belirtilen tüm adlandırılmış yakalama gruplarının sonuçlarını içerir.

Sonuç

Atladığım bir konu varsa lütfen aşağıdaki yorumlar bölümünden bana bildirin. JavaScript'te yapılan son değişiklikler hakkında daha fazla bilgiyi önceki güncellemelerde veya V8 web sitesinde bulabilirsiniz.