⊗jsSpRELAB 133 of 294 menu

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 :

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

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

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

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

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

Problèmes pratiques

Soit une chaîne contenant des noms de fonctions :

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

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

Soit une chaîne avec une balise :

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

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

Soit une chaîne avec des variables :

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

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

hukabnswit