La maggior parte delle espressioni qui risolve singoli casi d'uso specifici.
Va bene, ma preferisco un approccio "sempre funzionante".
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Ciò "sfuggirà completamente" a una stringa letterale per uno dei seguenti usi nelle espressioni regolari:
- Inserimento in un'espressione regolare. Per esempio
new RegExp(regExpEscape(str))
- Inserimento in una classe di caratteri. Per esempio
new RegExp('[' + regExpEscape(str) + ']')
- Inserimento nello specificatore del numero intero. Per esempio
new RegExp('x{1,' + regExpEscape(str) + '}')
- Esecuzione in motori di espressione regolare non JavaScript.
Personaggi speciali coperti:
-
: Crea un intervallo di caratteri in una classe di caratteri.
[
/ ]
: Avvia / termina una classe di caratteri.
{
/ }
: Avvia / termina un identificatore di numerazione.
(
/ )
: Avvia / termina un gruppo.
*
/ +
/ ?
: Specifica il tipo di ripetizione.
.
: Corrisponde a qualsiasi personaggio.
\
: Consente di sfuggire ai caratteri e di avviare entità.
^
: Specifica l'inizio della zona di corrispondenza e annulla la corrispondenza in una classe di caratteri.
$
: Specifica la fine della zona corrispondente.
|
: Specifica l'alternanza.
#
: Specifica il commento in modalità di spaziatura libera.
\s
: Ignorato in modalità di spaziatura libera.
,
: Separa i valori nell'identificatore di numerazione.
/
: Avvia o termina l'espressione.
:
: Completa tipi di gruppo speciali e parte delle classi di caratteri in stile Perl.
!
: Nega il gruppo di larghezza zero.
<
/ =
: Parte delle specifiche del gruppo di larghezza zero.
Appunti:
/
non è strettamente necessario in nessun tipo di espressione regolare. Tuttavia, protegge in caso qualcuno (brivido) fa eval("/" + pattern + "/");
.
,
assicura che se la stringa deve essere un numero intero nello specificatore numerico, causerà correttamente un errore di compilazione RegExp invece di una compilazione silenziosa errata.
#
e \s
non è necessario eseguire l'escape in JavaScript, ma in molti altri gusti. Vengono salvati qui nel caso in cui l'espressione regolare venga successivamente passata a un altro programma.
Se hai anche bisogno di rendere l'espressione regolare a prova di futuro contro potenziali aggiunte alle funzionalità del motore regex di JavaScript, ti consiglio di usare il più paranoico:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Questa funzione sfugge a tutti i caratteri ad eccezione di quelli esplicitamente garantiti che non possono essere utilizzati per la sintassi nei futuri gusti di espressioni regolari.
Per gli appassionati di servizi igienico-sanitari, considera questo caso limite:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Questo dovrebbe compilare bene in JavaScript, ma non in alcuni altri gusti. Se si intende passare a un altro sapore, il caso nullo di s === ''
deve essere verificato in modo indipendente, in questo modo:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
sta attualmente lavorando e chiunque pensi di avere un input prezioso è il benvenuto. core-js e altri polyfill lo offrono.