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:

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

javascriptlet 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:

javascriptlet res = str.replace(/a.+?x/g, '!');

Açgözçilik ähli gaýtalanma operatorlaryna çäklendirip bolýar: *, ?, we {} - şeýle: *?, ?? we {}?.

Задание 1

Setir berlen:

javascriptlet 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).