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 sunuldu. match() işlevine benzer şekilde davranır, ancak genel veya yapışkan normal ifadede tüm normal ifade eşleşmelerine sahip bir yineleme döndürür. Bu, özellikle grupları yakalamak için gerektiğinde eşleşmeleri yinelemek için basit bir yol sunar.

match() ile ilgili sorun nedir?

Yakalama gruplarıyla genel eşleşmeleri döndürmeye çalışmadığınız sürece kısa yanıt hiçbir şey değildir. İşte sizin için bir programlama bulmacası. Aşağıdaki kodu göz önünde bulundurun:

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' ve 'test2' dizelerini içeren bir dizi döndürdüğüne dikkat edin. G işaretini normal ifadeden kaldırırsam, aldığım öğe tüm yakalama gruplarıma sahip oluyor, ancak yalnızca ilk eşleşmeyi elde ediyorum. 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şme yok. Şimdi mesele şu: Her bir eşleşme için tüm yakalama gruplarını nasıl elde edebilirim? String.prototype.matchAll() teklifinin açıklayıcısı iki olası yaklaşımı göstermektedir. Bunları tarif etmeyeceğim çünkü artık ihtiyacınız olmayacak.

String.prototype.matchAll()

matchAll() kullanıldığında açıklayıcı örnekler 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 edilmesi gereken birkaç nokta var. Genel aramada bir dizi döndüren match()'in aksine matchAll(), for...of döngüleriyle güzel şekilde çalışan bir yineleyici döndürür. Yineleme, birkaç ekstra özelliğe sahip yakalama grupları da dahil olmak üzere her eşleşme için bir dizi oluşturur. Bunları konsola yazdırırsanız aşağıdaki gibi görünürler:

['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, match() tarafından genel olmayan normal ifadeler için döndürdüğü biçimde tam olarak aynı biçimde bir dizi olduğunu fark edebilirsiniz.

Bonus materyal

Bu, genellikle normal ifadeler konusunda yeni olan veya uzman olmayan kişiler içindir. hem match() hem de matchAll() işlevinin (her iterasyon için) bazı ek adlandırılmış özelliklere sahip diziler olduğunu fark etmiş olabilirsiniz. Bu makaleyi hazırlarken bu özelliklerin MDN'de bazı belgelerle ilgili eksiklikler olduğunu fark ettim (bu hataları düzelttim). İşte kısa bir açıklama.

index
Orijinal dizedeki ilk sonucun dizini. Yukarıdaki örnekte test2 5. konumda başladığı için index değeri 5'tir.
input
matchAll() öğesinin çalıştırıldığı tam dize. Benim örneğimde bu 'test1test2' idi.
groups
Normal ifadenizde belirtilen adlandırılmış yakalama gruplarının sonuçlarını içerir.

Sonuç

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