Beperking van gulzigheid in regex in JavaScript
Reguliere expressies zijn standaard gulzig. Dit betekent dat ze het maximaal mogelijke aantal tekens vastleggen. Laten we dit uitleggen met een voorbeeld. Stel dat we de volgende string hebben:
let str = 'aeeex zzz x kkk';
Stel dat we in deze string de substring
'aeeex' willen vinden volgens het volgende patroon: letter
'a', dan elk teken een of meer
keer, dan letter 'x'.
let res = str.replace(/a.+x/g, '!');
We verwachten dat het resultaat in de variabele
de string '! zzz x kkk' zal zijn. Echter,
dit is niet het geval - de variabele bevat de string
'! kkk'.
De reden is dat onze regex alle
tekens zoekt van de letter 'a' tot de letter 'x'.
Maar in onze string staan twee letters 'x'! Door
de gulzigheid zoekt de regex tot
de allerlaatste 'x', waardoor hij
iets vastlegt dat we niet verwachtten.
Natuurlijk is dit gedrag vaak precies wat we nodig hebben. Maar in dit specifieke geval zouden we de gulzigheid willen uitschakelen en de regex zeggen dat hij moet zoeken tot de eerste 'x'.
Om gulzigheid te beperken, moet je na de herhalingsoperator een vraagteken plaatsen:
let res = str.replace(/a.+?x/g, '!');
Gulzigheid kan worden beperkt voor alle herhalingsoperatoren:
zowel *, als ?, als {}
- zoals volgt: *?, ?? en {}?.
Gegeven de volgende string:
let str = 'aba accca azzza wwwwa';
Schrijf een regex die alle strings vindt
waar aan de randen de letters 'a' staan,
en vervang elk ervan door '!'. Tussen
de letters 'a' kan elk teken staan (behalve
'a').