JavaScript-da regulýar ifadelerde açgözçiligi çäklendirmek
Regulýar ifadeler, deslapky ýagdaýynda açgöz bolýar. Bu onuň ýönekeý aýdylanda, iň köp mümkin bolan nyşanlary gapdarýandygyny aňladýar. Geliň bir mysal bilen düşüneliň. Bizde şeýle bir setir bolsun:
let str = 'aeeex zzz x kkk';
Biz bu setirde 'aeeex' setir bölegini şu şablona
görä tapmak isleýäris: 'a' harpydan
'a', soňra islendik nyşan bir ýa-da birnäçe gezek,
soňra bolsa 'x' harpysy.
let res = str.replace(/a.+x/g, '!');
Netijede üýtgeýjiniň içine '! zzz x kkk' setiriniň
ýazyljakdygyny garaýarys. Ýöne, beýle bolmaýar - üýtgeýjiniň içine
'! kkk' setiri düşýär.
Mesele şonda, bizniň regulýar ifademiz 'a' harpyndan
'x' harpyna çenli ähli nyşanlary gözleýär.
Ýöne, bizniň setirimizde iki sany 'x' harpysy bar! Açgözçiligiň
sebäbi, regulýar ifade iň soňky 'x'-e çenli gözleýär, şonuň bilen
biz garaşşanymyzdan başga zady gapdarýar.
Elbetde, köplenç bu hereket bize gerek bolýar. Ýöne, aýratyn bu ýagdaýda biz açgözçiligi ýatyryp, regulýar ifade birinji 'x'-i gözlemegini aýtmak isleýäris.
Açgözçiligi çäklendirmek üçin, gaýtalanma operatorynyň yzyndan sorag nyşany goýmaly:
let res = str.replace(/a.+?x/g, '!');
Açgözçilik ähli gaýtalanma operatorlaryna çäklendirip bolýar:
*, ?, we {}
- şeýle: *?, ?? we {}?.
Setir berlen:
let str = 'aba accca azzza wwwwa';
Her iki gyrasynda 'a' harpylary durýan ähli setirleri
tapýan we olaryň her birini '!' bilen çalşýan bir regulýar
ifade ýazyň. 'a' harpylarynyň arasynda islendik nyşan
bolup biler ('a' dan başga).