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:

javascript'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:

javascript'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':

javascript'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':

javascript'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':

javascript'baaa'.replace(/(?<!x)aaa/g, '!'); // returnerer 'b!'

Praktiske opgaver

Задание 1

Givet en streng, der indeholder funktionsnavne:

javascriptlet str = 'func1() func2() func3()';

Få et array med funktionsnavnene fra strengen.

Задание 2

Givet en streng med et tag:

javascriptlet str = '<a href="" class="eee" id="zzz">';

Få et array med attributnavnene for dette tag.

Задание 3

Givet en streng med variabler:

javascriptlet str = '$aaa $bbb $ccc xxxx';

Få delstrengene, foran hvilke der står et dollartegn.