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:

javascriptlet 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'.

javascriptlet 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:

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

Chamtivost lze omezit u všech operátorů opakování: ať už *, ?, nebo {} - takto: *?, ?? a {}?.

Задание 1

Je dán řetězec:

javascriptlet 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').