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:

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

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

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

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

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

Praktiska uppgifter

Задание 1

Given är en sträng som innehåller funktionsnamn:

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

Få en array med funktionsnamn från strängen.

Задание 2

Given är en sträng med en tagg:

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

Få en array med attributnamn för denna tagg.

Задание 3

Given är en sträng med variabler:

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

Få delsträngarna, framför vilka dollartecknet står.