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 nedenleindex
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.