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.