⊗jsSpRELAB 133 of 294 menu

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:

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

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

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

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

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

Praktische Aufgaben

Gegeben ist ein String, der Funktionsnamen enthält:

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

Erhalten Sie ein Array der Funktionsnamen aus dem String.

Gegeben ist ein String mit einem Tag:

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

Erhalten Sie ein Array der Attributnamen dieses Tags.

Gegeben ist ein String mit Variablen:

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

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

deidkkmssv