A maioria das expressões aqui resolve casos de uso específicos únicos.
Tudo bem, mas eu prefiro uma abordagem "sempre funciona".
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Isso "escapará totalmente" de uma cadeia literal para qualquer um dos seguintes usos em expressões regulares:
- Inserção em uma expressão regular. Por exemplo
new RegExp(regExpEscape(str))
- Inserção em uma classe de caractere. Por exemplo
new RegExp('[' + regExpEscape(str) + ']')
- Inserção no especificador de número inteiro. Por exemplo
new RegExp('x{1,' + regExpEscape(str) + '}')
- Execução em mecanismos de expressão regular não JavaScript.
Caracteres Especiais Cobertos:
-
: Cria um intervalo de caracteres em uma classe de caracteres.
[
/ ]
: Inicia / termina uma classe de personagem.
{
/ }
: Inicia / termina um especificador de numeração.
(
/ )
: Inicia / termina um grupo.
*
/ +
/ ?
: Especifica o tipo de repetição.
.
: Corresponde a qualquer caractere.
\
: Ignora caracteres e inicia entidades.
^
: Especifica o início da zona correspondente e nega a correspondência em uma classe de caracteres.
$
: Especifica o fim da zona correspondente.
|
: Especifica alternância.
#
: Especifica o comentário no modo de espaçamento livre.
\s
: Ignorado no modo de espaçamento livre.
,
: Separa valores no especificador de numeração.
/
: Inicia ou termina a expressão.
:
: Conclui tipos de grupos especiais e parte de classes de caracteres no estilo Perl.
!
: Nega o grupo de largura zero.
<
/ =
: Parte das especificações do grupo de largura zero.
Notas:
/
não é estritamente necessário em qualquer sabor de expressão regular. No entanto, ele protege no caso de alguém (tremor) faz eval("/" + pattern + "/");
.
,
garante que, se a string for um número inteiro no especificador numérico, ela causará corretamente um erro de compilação RegExp em vez de compilar incorretamente silenciosamente.
#
, e \s
não precisa ser escapado em JavaScript, mas sim em muitos outros tipos. Eles são escapados aqui caso a expressão regular seja passada posteriormente para outro programa.
Se você também precisa proteger a expressão regular contra possíveis adições aos recursos do mecanismo de expressão regular JavaScript, recomendo usar o mais paranóico:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Essa função escapa de todos os caracteres, exceto aqueles explicitamente garantidos, que não serão utilizados para sintaxe em futuros sabores de expressões regulares.
Para quem realmente gosta de saneamento, considere este exemplo:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Isso deve compilar bem em JavaScript, mas não em outros tipos. Se pretender passar para outro sabor, o caso nulo de s === ''
deve ser verificado independentemente, da seguinte forma:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
estão trabalhando atualmente e qualquer pessoa que pense ter uma contribuição valiosa é muito bem-vinda para contribuir. core-js e outros polyfills oferecem isso.