Escapando caracteres especiais em expressões regulares JavaScript
Suponha que queiramos que um caractere especial represente a si mesmo. Para isso, precisamos escapá-lo usando uma barra invertida. Vamos ver alguns exemplos.
Exemplo
No exemplo a seguir, o autor da expressão regular queria
que o padrão de busca fosse: letra
'a', depois o sinal de mais '+', depois
a letra 'x'. No entanto, o autor do código
não escapou o caractere '+' e, portanto,
o padrão de busca na verdade é: letra
'a' uma ou mais vezes, depois
a letra 'x':
let str = 'a+x ax aax aaax';
let res = str.replace(/a+x/g, '!');
Como resultado, a variável armazenará o seguinte:
'a+x ! ! !'
Exemplo
Agora, o autor escapou o sinal de mais com uma barra invertida.
Assim, o padrão de busca fica correto: letra
'a', depois o sinal de mais
'+', depois a letra 'x'.
let str = 'a+x ax aax aaax';
let res = str.replace(/a\+x/g, '!');
Como resultado, a variável armazenará o seguinte:
'! ax aax aaax'
Exemplo
Neste exemplo, o padrão é: letra
'a', depois o ponto '.', depois
a letra 'x':
let str = 'a.x abx azx';
let res = str.replace(/a\.x/g, '!');
Como resultado, a variável armazenará o seguinte:
'! abx azx'
Exemplo
No exemplo a seguir, o autor esqueceu de escapar o ponto e a expressão regular capturou todas as substrings, pois um ponto não escapado representa qualquer caractere:
let str = 'a.x abx azx';
let res = str.replace(/a.x/g, '!');
Como resultado, a variável armazenará o seguinte:
'! ! !'
Observação
Preste atenção que se você esquecer a barra invertida para o ponto (quando ele deveria representar a si mesmo) - isso pode passar despercebido:
'a.x'.replace(/a.x/g, '!'); // retorna '!', como queríamos
Visualmente funciona corretamente (já que o ponto
representa qualquer caractere, inclusive um ponto
literal '.'). Mas se alterarmos a string
onde as substituições ocorrem - veremos nosso erro:
'a.x abx azx'.replace(/a.x/g, '!'); // retorna '! ! !', mas esperávamos '! abx azx'
Lista de caracteres especiais e comuns
Se você escapar um caractere comum - nada de ruim acontecerá - ele ainda representará a si mesmo. A exceção são os dígitos, que não podem ser escapados.
Muitas vezes surge a dúvida se um determinado caractere é especial. Alguns chegam ao ponto de escapar todos os caracteres suspeitos de uma vez. No entanto, isso é uma má prática (polui a expressão regular com barras invertidas).
São caracteres especiais: $ ^ . * + ? \
/ {} [] () |
Não são caracteres especiais: @ : , ' " ;
- _ = < > % # ~ `& !
Problemas práticos
Dada a string:
let str = 'a.a aba aea';
Escreva uma expressão regular que encontre a string
'a.a', sem capturar as demais.
Dada a string:
let str = '2+3 223 2223';
Escreva uma expressão regular que encontre a string
'2+3', sem capturar as demais.
Dada a string:
let str = '23 2+3 2++3 2+++3 345 567';
Escreva uma expressão regular que encontre as strings
'2+3', '2++3', '2+++3',
sem capturar as demais (+ pode aparecer qualquer
quantidade de vezes).
Dada a string:
let str = '23 2+3 2++3 2+++3 445 677';
Escreva uma expressão regular que encontre as strings
'23', '2+3', '2++3',
'2+++3', sem capturar as demais.
Dada a string:
let str = '*+ *q+ *qq+ *qqq+ *qqq qqq+';
Escreva uma expressão regular que encontre as strings
'*q+', '*qq+', '*qqq+',
sem capturar as demais.
Dada a string:
let str = '[abc] {abc} abc (abc) [abc]';
Escreva uma expressão regular que encontre as strings
entre colchetes e as substitua por '!'.