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çinindex
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.