Positieve en negatieve lookahead in JavaScript reguliere expressies
Soms moet je een probleem van dit type oplossen: vind
de string 'aaa' en vervang deze door '!',
maar alleen als na 'aaa'
'x' staat, en de 'x' zelf
niet vervangen. Als we het probleem proberen
op te lossen 'op de directe manier', zal het ons niet lukken:
'aaax baaa'.replace(/aaax/g, '!'); // retourneert '! baaa', maar we wilden '!x baaa'
Lookahead
Om het probleem op te lossen, is een manier nodig om te zeggen
dat 'x' niet vervangen moet worden. Dit wordt
gedaan met behulp van speciale haakjes (?= ),
die alleen kijken, maar niet zelf meenemen.
Deze haakjes worden positieve lookahead genoemd.
Positief - omdat 'x'
(in ons geval) aanwezig moet zijn - alleen dan
vindt vervanging plaats.
Laten we deze haakjes toepassen om ons probleem op te lossen:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // retourneert '!x aaab'
Er is ook negatieve lookahead
- (?! ) - deze zegt juist dat
iets niet aanwezig moet zijn. In het volgende voorbeeld
vindt vervanging alleen plaats als na 'aaa'
GEEN 'x' staat:
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // retourneert 'aaax !b'
Lookbehind
Op een vergelijkbare manier is er positieve lookbehind
- (?<= ). In het volgende
voorbeeld vindt vervanging alleen plaats als vóór
'aaa' een 'x' staat:
'xaaa'.replace(/(?<=x)aaa/g, '!'); // retourneert 'x!'
En er is ook negatieve lookbehind
- (?<! ). In het volgende voorbeeld vindt vervanging
alleen plaats als vóór 'aaa'
geen 'x' staat:
'baaa'.replace(/(?<!x)aaa/g, '!'); // retourneert 'b!'
Praktische opdrachten
Gegeven een string die functienamen bevat:
let str = 'func1() func2() func3()';
Verkrijg een array met functienamen uit de string.
Gegeven een string met een tag:
let str = '<a href="" class="eee" id="zzz">';
Verkrijg een array met de namen van de attributen van deze tag.
Gegeven een string met variabelen:
let str = '$aaa $bbb $ccc xxxx';
Verkrijg de substrings waarvoor een dollarteken staat.