JavaScript'te Düzenli İfadelerde Açgözlülüğü Sınırlama
Düzenli ifadeler varsayılan olarak açgözlüdür. Bu, mümkün olan maksimum karakteri yakaladıkları anlamına gelir. Bir örnekle inceleyelim. Diyelim ki şöyle bir dizgemiz var:
let str = 'aeeex zzz x kkk';
Diyelim ki bu dizgede, aşağıdaki kalıbı
kullanarak 'aeeex' alt dizisini
bulmak istiyoruz: 'a' harfi,
ardından herhangi bir bir veya daha fazla karakter,
ardından 'x' harfi.
let res = str.replace(/a.+x/g, '!');
Sonuç olarak değişkene '! zzz x kkk'
dizesinin yazılmasını bekliyoruz. Ancak,
öyle olmuyor - değişkene '! kkk'
dizesi giriyor.
Bunun nedeni, düzenli ifademizin 'a'
harfinden 'x' harfine kadar olan tüm
karakterleri aramasıdır.
Ancak dizgemizde iki tane 'x' harfi var!
Açgözlülük nedeniyle, düzenli ifade en sondaki
x'e kadar arar ve böylece beklediğimizden
farklı bir şeyi yakalar.
Elbette, çoğu zaman bu davranış tam da ihtiyacımız olan şeydir. Ancak özellikle bu durumda, açgözlülüğü iptal etmek ve düzenli ifadeye ilk x'i bulmasını söylemek istiyoruz.
Açgözlülüğü sınırlamak için, tekrarlama operatöründen sonra bir soru işareti konulmalıdır:
let res = str.replace(/a.+?x/g, '!');
Açgözlülük tüm tekrarlama operatörleri için
sınırlandırılabilir: *, ?, ve {}
- şu şekilde: *?, ?? ve {}?.
Bir dize verildi:
let str = 'aba accca azzza wwwwa';
Kenarlarında 'a' harfleri bulunan tüm dizgeleri
bulan ve her birini '!' ile değiştiren
bir düzenli ifade yazın.
'a' harfleri arasında ('a' hariç)
herhangi bir karakter olabilir.