Omejitev požrešnosti v regularnih izrazih v JavaScript
Regularni izrazi so privzeto požrešni. To pomeni, da zajamejo največje možno število znakov. Razložimo s primerom. Recimo, da imamo takšno verigo:
let str = 'aeeex zzz x kkk';
Recimo, da v tej verigi želimo najti podverigo
'aeeex' po naslednjem vzorcu: črka
'a', nato kateri koli znak enkrat ali večkrat,
nato črka 'x'.
let res = str.replace(/a.+x/g, '!');
Pričakujemo, da se bo v spremenljivko kot rezultat
zapisala veriga '! zzz x kkk'. Vendar
ni tako - v spremenljivko pride veriga
'! kkk'.
Bistvo je v tem, da naš regularni izraz išče vse
znake od črke 'a' do črke 'x'.
Toda v naši verigi sta dve črki 'x'! Zaradi
požrešnosti se izkaže, da regularni izraz išče do
zadnjega x, s čimer zajame nekaj,
česar nismo pričakovali.
Seveda je takšno vedenje pogosto točkar to, kar potrebujemo. Toda ravno v tem primeru bi želeli preklicati požrešnost in reči regularnemu izrazu, naj išče do prvega x.
Za omejitev požrešnosti je treba za operatorjem ponavljanja postaviti vprašaj:
let res = str.replace(/a.+?x/g, '!');
Požrešnost je mogoče omejiti vsem operatorjem
ponavljanja: tako *, kot ?, in {}
- takole: *?, ?? in {}?.
Podana je veriga:
let str = 'aba accca azzza wwwwa';
Napišite regularni izraz, ki bo našel vse verige
na katerih robovih so črke 'a',
in jih zamenjal z '!'. Med
črkama 'a' je lahko kateri koli znak (razen
'a').