Positiv och negativ lookahead i JavaScript reguljära uttryck
Ibland behöver man lösa en uppgift av den här typen: hitta
strängen 'aaa' och ersätt den med '!',
men bara om efter 'aaa' står
'x', och själva 'x' ska
inte ersättas. Om vi försöker lösa uppgiften
'rakt på', kommer det inte att lyckas:
'aaax baaa'.replace(/aaax/g, '!'); // returnerar '! baaa', men vi ville ha '!x baaa'
Lookahead
För att lösa uppgiften behövs ett sätt att säga,
att 'x' inte ska ersättas. Detta görs
med hjälp av speciella parenteser (?= ),
som bara tittar, men inte tar med sig.
Dessa parenteser kallas positiv lookahead
. Positiv - eftersom 'x'
(i vårt fall) måste finnas - bara då kommer
ersättningen att ske.
Låt oss använda dessa parenteser för att lösa vår uppgift:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // returnerar '!x aaab'
Det finns också negativ lookahead
- (?! ) - den säger, tvärtom, att
något inte ska finnas. I följande exempel
kommer ersättningen att ske, bara om efter 'aaa'
inte står 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // returnerar 'aaax !b'
Lookbehind
På ett liknande sätt finns det positiv lookbehind
- (?<= ). I följande
exempel kommer ersättningen att ske, bara om före
'aaa' står 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // returnerar 'x!'
Och det finns också negativ lookbehind
- (?<! ). I följande exempel kommer ersättningen
att ske, bara om före 'aaa'
inte står 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // returnerar 'b!'
Praktiska uppgifter
Given är en sträng som innehåller funktionsnamn:
let str = 'func1() func2() func3()';
Få en array med funktionsnamn från strängen.
Given är en sträng med en tagg:
let str = '<a href="" class="eee" id="zzz">';
Få en array med attributnamn för denna tagg.
Given är en sträng med variabler:
let str = '$aaa $bbb $ccc xxxx';
Få delsträngarna, framför vilka dollartecknet står.