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:
let 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'.
let 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:
let res = str.replace(/a.+?x/g, '!');
Ahust saab piirata kõikidele kordusoperaatoritele:
nii *, kui ?, ja {}
- niimoodi: *?, ?? ja {}?.
Antud sõne:
let 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').