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.