⊗jsSpRELAB 133 of 294 menu

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.

hikkbnuzlen