Hífen dentro de conjuntos em expressões regulares JavaScript
O hífen - também é um caractere especial dentro de [ ]
(mas fora deles - não é). Se você precisa do próprio
hífen como um caractere - coloque-o em uma posição
onde ele não será interpretado como um separador
de intervalo.
Por que isso é importante: você pode criar um intervalo
de caracteres sem perceber. Por exemplo,
assim - '[:-@]' - você acha que está
selecionando dois-pontos, hífen e arroba, mas na
verdade, obtém-se um intervalo de caracteres entre
: e @. Este intervalo inclui
os seguintes caracteres: ? < = > : ;
De onde eles vêm? Da tabela ASCII - o dois-pontos tem um número menor que o da arroba - e assim forma-se um intervalo. Ou seja, todos os intervalos são formados de acordo com a tabela ASCII (se desejar, pode-se usar isso a seu favor).
Como lidar com isso: coloque o caractere hífen
onde ele certamente não será interpretado como
um caractere de intervalo, por exemplo, no início ou no final
(ou seja, depois de [ ou antes de ]).
Também é possível escapar o hífen - então
ele representará a si mesmo, independentemente da
posição. Por exemplo, em vez de [:-@], escreva
[:\-@] - e não haverá mais um intervalo, mas
sim três caracteres - dois-pontos, hífen e arroba
@.
Exemplo
No exemplo a seguir, o padrão de busca é:
dígito 1, depois uma letra de 'a'
a 'z', depois o dígito 2:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[a-z]2/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! 1-2 ! !'
Exemplo
Agora vamos escapar o hífen. Como resultado,
o padrão de busca é: dígito 1, depois
a letra 'a', ou hífen, ou a letra 'z',
depois o dígito 2:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[a\-z]2/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! ! 1c2 !'
Exemplo
É possível simplesmente reposicionar o hífen, sem escapá-lo:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[az-]2/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! ! 1c2 !'
Exemplo
No exemplo a seguir, o padrão de busca é:
o primeiro caractere é letras minúsculas ou
hífen '-', depois duas letras 'x':
let str = 'axx Axx -xx @xx';
let res = str.replace(/[a-z-]xx/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! Axx ! @xx'
Exemplo
No exemplo a seguir, o padrão de busca é:
o primeiro caractere é letras minúsculas, letras
maiúsculas ou hífen '-', depois duas letras
'x':
let str = 'axx Axx -xx @xx';
let res = str.replace(/[a-zA-Z-]xx/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! ! ! @xx'
Exemplo
É possível colocar o hífen entre dois intervalos - lá ele certamente não criará outro intervalo:
let str = 'axx 9xx -xx @xx';
let res = str.replace(/[a-z-0-9]xx/g, '!');
Como resultado, o seguinte será armazenado na variável:
'! ! ! @xx'
Problemas práticos
Dada a string:
let str = 'xaz xBz xcz x-z x@z';
Encontre todas as strings seguindo o padrão:
letra 'x', letra maiúscula ou minúscula
ou hífen, letra 'z'.
Dada a string:
let str = 'xaz x$z x-z xcz x+z x%z x*z';
Encontre todas as strings seguindo o padrão:
letra 'x', depois ou cifrão, ou
hífen ou sinal de mais, depois letra 'z'.