Positives und negatives Lookahead in JavaScript-Regulären Ausdrücken

Manchmal muss man eine Aufgabe folgenden Typs lösen: finde die Zeichenkette 'aaa' und ersetze sie durch '!', aber nur wenn nach 'aaa' 'x' steht, wobei das 'x' selbst nicht ersetzt werden soll. Wenn wir versuchen, die Aufgabe 'direkt' zu lösen, wird es nicht gelingen:

javascript'aaax baaa'.replace(/aaax/g, '!'); // gibt '! baaa' zurück, gewünscht war '!x baaa'

Lookahead

Um die Aufgabe zu lösen, benötigen wir eine Möglichkeit zu sagen, dass 'x' nicht ersetzt werden soll. Dies wird mit Hilfe spezieller Klammern (?= ) erreicht, die nur prüfen, aber nicht mit aufgenommen werden.

Diese Klammern werden positives Lookahead genannt. Positiv - weil 'x' (in unserem Fall) vorhanden sein muss - nur dann findet die Ersetzung statt.

Lassen Sie uns diese Klammern zur Lösung unserer Aufgabe anwenden:

javascript'aaax aaab'.replace(/aaa(?=x)/g, '!'); // gibt '!x aaab' zurück

Es gibt auch negatives Lookahead - (?! ) - dies sagt im Gegensatz dazu, dass etwas nicht vorhanden sein darf. Im folgenden Beispiel findet die Ersetzung nur statt, wenn nach 'aaa' KEIN 'x' steht:

javascript'aaax aaab'.replace(/aaa(?!x)/g, '!'); // gibt 'aaax !b' zurück

Lookbehind

Analog dazu gibt es positives Lookbehind - (?<= ). Im folgenden Beispiel findet die Ersetzung nur statt, wenn vor 'aaa' ein 'x' steht:

javascript'xaaa'.replace(/(?<=x)aaa/g, '!'); // gibt 'x!' zurück

Und es gibt auch negatives Lookbehind - (?<! ). Im folgenden Beispiel findet die Ersetzung nur statt, wenn vor 'aaa' kein 'x' steht:

javascript'baaa'.replace(/(?<!x)aaa/g, '!'); // gibt 'b!' zurück

Praktische Aufgaben

Задание 1

Gegeben ist ein String, der Funktionsnamen enthält:

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

Erhalten Sie ein Array der Funktionsnamen aus dem String.

Задание 2

Gegeben ist ein String mit einem Tag:

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

Erhalten Sie ein Array der Attributnamen dieses Tags.

Задание 3

Gegeben ist ein String mit Variablen:

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

Erhalten Sie die Teilzeichenketten, vor denen ein Dollar-Zeichen steht.