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 \snon è 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.escapesta attualmente lavorando e chiunque pensi di avere un input prezioso è il benvenuto. core-js e altri polyfill lo offrono.