Obmedzenie chamivosti v regulárnych výrazoch v JavaScripte
Regulárne výrazy sú predvolene chamivé. To znamená, že zachytávajú maximálne možný počet znakov. Poďme si to rozobrať na príklade. Nech máme takýto reťazec:
let str = 'aeeex zzz x kkk';
Nech chceme v tomto reťazci nájsť podreťazec
'aeeex' podľa nasledujúceho vzoru: písmeno
'a', potom ľubovoľný znak jeden alebo viac
krát, potom písmeno 'x'.
let res = str.replace(/a.+x/g, '!');
Očakávame, že do premennej sa ako výsledok
zapíše reťazec '! zzz x kkk'. Avšak,
nie je to tak - do premennej sa dostane reťazec
'! kkk'.
Celé je to o tom, že náš regulárny výraz hľadá všetky
znaky od písmena 'a' po písmeno 'x'.
Ale v našom reťazci sú dve písmená 'x'! Kvôli
chamivosti sa stane, že regulárny výraz hľadá až
do úplne posledného x, tým pádom zachytáva
nie to, čo sme očakávali.
Samozrejme, často je toto správanie presne to, čo potrebujeme. Ale konkrétne v tomto prípade by sme chceli zrušiť chamivosť a povedať regulárnemu výrazu, aby hľadal len do prvého x.
Na obmedzenie chamivosti je potrebné po operátori opakovania umiestniť otáznik:
let res = str.replace(/a.+?x/g, '!');
Chamivosť možno obmedziť všetkým operátorom
opakovania: aj *, aj ?, aj {}
- takto: *?, ?? a {}?.
Daný reťazec:
let str = 'aba accca azzza wwwwa';
Napíšte regulárny výraz, ktorý nájde všetky reťazce
na whose okrajoch sú písmená 'a',
a nahradí každý z nich na '!'. Medzi
písmenami 'a' môže byť ľubovoľný znak (okrem
'a').