Lookahead et lookbehind positifs et négatifs dans les expressions régulières JavaScript

Parfois, il faut résoudre un problème de ce type : trouver la chaîne 'aaa' et la remplacer par '!', mais seulement si après 'aaa' se trouve 'x', sans remplacer 'x' lui-même. Si nous essayons de résoudre le problème 'directement', nous n'y arriverons pas :

javascript'aaax baaa'.replace(/aaax/g, '!'); // renvoie '! baaa', mais nous voulions '!x baaa'

Lookahead

Pour résoudre le problème, il faut un moyen de dire que 'x' ne doit pas être remplacé. Cela se fait à l'aide de parenthèses spéciales (?= ), qui vérifient simplement sans consommer les caractères.

Ces parenthèses sont appelées lookahead positif. Positif - car 'x' (dans notre cas) doit être présent - alors seulement le remplacement aura lieu.

Utilisons ces parenthèses pour résoudre notre problème :

javascript'aaax aaab'.replace(/aaa(?=x)/g, '!'); // renvoie '!x aaab'

Il existe aussi le lookahead négatif - (?! ) - il dit, au contraire, que quelque chose ne doit pas être présent. Dans l'exemple suivant, le remplacement aura lieu seulement si après 'aaa' il n'y a PAS 'x' :

javascript'aaax aaab'.replace(/aaa(?!x)/g, '!'); // renvoie 'aaax !b'

Lookbehind

De manière analogue, il existe le lookbehind positif - (?<= ). Dans l'exemple suivant, le remplacement aura lieu seulement si avant 'aaa' se trouve 'x' :

javascript'xaaa'.replace(/(?<=x)aaa/g, '!'); // renvoie 'x!'

Et il existe aussi le lookbehind négatif - (?<! ). Dans l'exemple suivant, le remplacement aura lieu seulement si avant 'aaa' ne se trouve pas 'x' :

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

Problèmes pratiques

Задание 1

Soit une chaîne contenant des noms de fonctions :

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

Obtenez un tableau des noms de fonctions à partir de la chaîne.

Задание 2

Soit une chaîne avec une balise :

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

Obtenez un tableau des noms d'attributs de cette balise.

Задание 3

Soit une chaîne avec des variables :

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

Obtenez les sous-chaînes précédées par le symbole dollar.