Positiv og negativ lookahead i JavaScript regulære udtryk
Sommetider skal man løse en opgave af denne type: find
strengen 'aaa' og erstat den med '!',
men kun hvis der efter 'aaa' står
'x', mens 'x' selv
ikke skal erstattes. Hvis vi forsøger at løse opgaven
'direkte', vil det ikke lykkes:
'aaax baaa'.replace(/aaax/g, '!'); // returnerer '! baaa', men vi ønskede '!x baaa'
Lookahead
For at løse opgaven har vi brug for en måde at sige,
at 'x' ikke skal erstattes. Dette gøres
ved hjælp af specielle parenteser (?= ),
der kun kigger, men ikke tager med.
Disse parenteser kaldes positiv lookahead
. Positiv - fordi 'x'
(i vores tilfælde) skal være til stede - kun så
vil erstatningen finde sted.
Lad os anvende disse parenteser til at løse vores opgave:
'aaax aaab'.replace(/aaa(?=x)/g, '!'); // returnerer '!x aaab'
Der findes også negativ lookahead
- (?! ) - som tværtimod siger, at
noget ikke skal være til stede. I det følgende eksempel
vil erstatningen kun finde sted, hvis der efter 'aaa'
IKKE står 'x':
'aaax aaab'.replace(/aaa(?!x)/g, '!'); // returnerer 'aaax !b'
Lookbehind
På samme måde findes der positiv lookbehind
- (?<= ). I det følgende
eksempel vil erstatningen kun finde sted, hvis der foran
'aaa' står 'x':
'xaaa'.replace(/(?<=x)aaa/g, '!'); // returnerer 'x!'
Og der findes også negativ lookbehind
- (?<! ). I det følgende eksempel vil erstatningen
kun finde sted, hvis der foran 'aaa'
ikke står 'x':
'baaa'.replace(/(?<!x)aaa/g, '!'); // returnerer 'b!'
Praktiske opgaver
Givet en streng, der indeholder funktionsnavne:
let str = 'func1() func2() func3()';
Få et array med funktionsnavnene fra strengen.
Givet en streng med et tag:
let str = '<a href="" class="eee" id="zzz">';
Få et array med attributnavnene for dette tag.
Givet en streng med variabler:
let str = '$aaa $bbb $ccc xxxx';
Få delstrengene, foran hvilke der står et dollartegn.