Regulaaravaldiste ahnuse piiramine JavaScriptis

Regulaaravaldised on vaikimisi ahnad. See tähendab, et nad püüavad kinni maksimaalse võimaliku arvu sümboleid. Vaatame seda näitega. Olgu meil selline sõne:

javascriptlet str = 'aeeex zzz x kkk';

Oletame, et selles sõnes tahame leida alamstringi 'aeeex' järgmise mustri järgi: täht 'a', siis suvaline sümbol üks või enam kordi, siis täht 'x'.

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

Me ootame, et muutujasse kirjutatakse tulemusena sõne '! zzz x kkk'. Siiski, see pole nii - muutujasse satub sõne '! kkk'.

Asi on selles, et meie regulaaravaldis otsib kõiki sümboleid tähest 'a' kuni täheni 'x'. Kuid meie sõnes on kaks tähte 'x'! Tänu ahnusele selgub, et regulaaravaldis otsib kuni viimase 'x'-ni, haarates seeläbi mitte seda, mida me ootasime.

Muidugi on selline käitumine sageli just see, mida me vajame. Kuid konkreetsel juhul sooviksime ahnust tühistada ja öelda regulaaravaldisele, et see otsiks esimese 'x'-ni.

Ahuse piiramiseks tuleb kordusoperaatori järele panna küsimärk:

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

Ahust saab piirata kõikidele kordusoperaatoritele: nii *, kui ?, ja {} - niimoodi: *?, ?? ja {}?.

Задание 1

Antud sõne:

javascriptlet str = 'aba accca azzza wwwwa';

Kirjutage regulaaravaldis, mis leiab kõik sõned, mille mõlemas otsas on tähed 'a', ja asendab igaühe neist '!'-ga. Tähtede 'a' vahel võib olla suvaline sümbol (välja arvatud 'a').