Omezení chamtivosti v regulárních výrazech v JavaScriptu
Regulární výrazy jsou ve výchozím nastavení chamtivé. To znamená, že zachytávají maximální možný počet znaků. Pojďme si to rozebrat na příkladu. Předpokládejme, že máme takovýto řetězec:
let str = 'aeeex zzz x kkk';
Předpokládejme, že v tomto řetězci chceme najít podřetězec
'aeeex' podle následujícího vzoru: písmeno
'a', poté jakýkoli znak jeden nebo více
krát, poté písmeno 'x'.
let res = str.replace(/a.+x/g, '!');
Očekávali bychom, že se do proměnné ve výsledku
zapíše řetězec '! zzz x kkk'. Avšak
tak to není - do proměnné se dostane řetězec
'! kkk'.
Všechno je to tím, že naše regulární výraz hledá všechny
znaky od písmene 'a' až po písmeno 'x'.
Ale v našem řetězci jsou dvě písmena 'x'! Kvůli
chamtivosti se stane, že regulární výraz hledá až
do posledního 'x', čímž zachytí
ne to, co jsme očekávali.
Samozřejmě, často je toto chování přesně to, co potřebujeme. Ale konkrétně v tomto případě bychom chtěli zrušit chamtivost a říci regulárnímu výrazu, aby hledal pouze k prvnímu 'x'.
Chcete-li omezit chamtivost, je třeba za operátorem opakování umístit otazník:
let res = str.replace(/a.+?x/g, '!');
Chamtivost lze omezit u všech operátorů
opakování: ať už *, ?, nebo {}
- takto: *?, ?? a {}?.
Je dán řetězec:
let str = 'aba accca azzza wwwwa';
Napište regulární výraz, který najde všechny řetězce
na jejichž okrajích stojí písmena 'a',
a nahradí každý z nich na '!'. Mezi
písmeny 'a' může být jakýkoli znak (kromě
'a').