JavaScript-də RegExp-in tamahkarlığının məhdudlaşdırılması
Regulyar ifadələr standart olaraq tamahkardır. Bu o deməkdir ki, onlar mümkün olan maksimum sayda simvolu tutur. Gəlin bir nümunə ilə baxaq. Tutaq ki, bizim belə bir sətirimiz var:
let str = 'aeeex zzz x kkk';
Tutaq ki, biz bu sətirdə aşağıdakı şablona görə
'aeeex' alt sətrini tapmaq istəyirik: hərf
'a', sonra istənilən simvol bir və ya daha çox
dəfə, sonra hərf 'x'.
let res = str.replace(/a.+x/g, '!');
Gözləyirik ki, nəticədə dəyişənə '! zzz x kkk'
sətri yazılsın. Lakin, belə olmur - dəyişənə
'! kkk' sətri düşür.
Bütün məsələ ondadır ki, bizim regulyar ifadə
'a' hərfindən 'x' hərfinə qədər bütün
simvolları axtarır.
Lakin bizim sətirdə iki 'x' hərfi var!
Tamahkarlıq səbəbindən belə olur ki, regulyar ifadə
ən son 'x'-ə qədər axtarır, bununla da
gözlədiyimizdən fərqli bir şeyi tutur.
Əlbəttə ki, çox vaxt bu davranış bizim üçün lazımdır.
Lakin xüsusi bu halda biz tamahkarlığı ləğv etmək
və regulyar ifadəyə ilk 'x'-ə qədər axtarmasını
demək istərdik.
Tamahkarlığı məhdudlaşdırmaq üçün təkrar operatorundan sonra sual işarəsi qoymaq lazımdır:
let res = str.replace(/a.+?x/g, '!');
Tamahkarlığı bütün təkrar operatorları üçün
məhdudlaşdırmaq olar: həm *, həm ?, həm də {}
- belə: *?, ?? və {}?.
Bir sətir verilib:
let str = 'aba accca azzza wwwwa';
Kənarlarında 'a' hərfləri olan bütün sətirləri
tapan və onların hər birini '!' ilə əvəz edən
regulyar ifadə yazın.
'a' hərfləri arasında istənilən simvol ('a'
xaricində) ola bilər.