Échappement des caractères spéciaux dans les regex JavaScript
Supposons que nous voulions qu'un caractère spécial désigne lui-même. Pour cela, il faut l'échapper avec un backslash. Regardons des exemples.
Exemple
Dans l'exemple suivant, l'auteur de l'expression régulière voulait
que le motif de recherche soit : lettre
'a', puis un plus '+', puis
lettre 'x'. Cependant, l'auteur du code
n'a pas échappé le symbole '+' et donc
le motif de recherche est en réalité :
lettre 'a' une ou plusieurs fois, puis
lettre 'x' :
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
En conséquence, la variable contiendra :
'a+x ! ! !'
Exemple
Maintenant, l'auteur a échappé le plus avec un
backslash. Maintenant le motif de recherche est
comme voulu : lettre 'a', puis plus
'+', puis lettre 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
En conséquence, la variable contiendra :
'! ax aax aaax'
Exemple
Dans cet exemple, le motif est : lettre
'a', puis point '.', puis
lettre 'x' :
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
En conséquence, la variable contiendra :
'! abx azx'
Exemple
Dans l'exemple suivant, l'auteur a oublié d'échapper le point et toutes les sous-chaînes ont été capturées par la regex, car un point non échappé désigne n'importe quel caractère :
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
En conséquence, la variable contiendra :
'! ! !'
Remarque
Notez que si vous oubliez le backslash pour le point (quand il doit désigner lui-même) - on peut même ne pas le remarquer :
'a.x'.replace(/a.x/g, '!'); // renvoie '!', comme nous le voulions
Visuellement, cela fonctionne correctement (car le point
désigne n'importe quel caractère, y compris un point
normal '.'). Mais si on change la chaîne
dans laquelle les remplacements ont lieu - nous verrons notre
erreur :
'a.x abx azx'.replace(/a.x/g, '!'); // renvoie '! ! !', mais on attendait '! abx azx'
Liste des caractères spéciaux et ordinaires
Si on échappe un caractère ordinaire - rien de grave n'arrive - il désignera toujours lui-même. Exception - les chiffres, on ne peut pas les échapper.
On doute souvent si un caractère donné est spécial. Certains en viennent à échapper tous les caractères suspects les uns après les autres. Cependant, c'est une mauvaise pratique (encombre l'expression régulière de backslashes).
Les caractères spéciaux sont : $ ^ . * + ? \
/ {} [] () |
Ne sont pas des caractères spéciaux : @ : , ' " ;
- _ = < > % # ~ `& !
Problèmes pratiques
Soit la chaîne :
let str = 'a.a aba aea';
Écrivez une expression régulière qui trouvera la chaîne
'a.a', sans capturer les autres.
Soit la chaîne :
let str = '2+3 223 2223';
Écrivez une expression régulière qui trouvera la chaîne
'2+3', sans capturer les autres.
Soit la chaîne :
let str = '23 2+3 2++3 2+++3 345 567';
Écrivez une expression régulière qui trouvera les chaînes
'2+3', '2++3', '2+++3',
sans capturer les autres (+ peut être n'importe quel
nombre).
Soit la chaîne :
let str = '23 2+3 2++3 2+++3 445 677';
Écrivez une expression régulière qui trouvera les chaînes
'23', '2+3', '2++3',
'2+++3', sans capturer les autres.
Soit la chaîne :
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Écrivez une expression régulière qui trouvera les chaînes
'*q+', '*qq+', '*qqq+',
sans capturer les autres.
Soit la chaîne :
let str = '[abc] {abc} abc (abc) [abc]';
Écrivez une expression régulière qui trouvera les chaînes
entre crochets et les remplacera par '!'.