Die meisten Ausdrücke hier lösen spezifische Einzelfälle.
Das ist in Ordnung, aber ich bevorzuge einen Ansatz, der "immer funktioniert".
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Dies wird einen literalen String für folgende Verwendungen in regulären Ausdrücken "vollständig escapen":
- Einfügen in einen regulären Ausdruck. z.B.
new RegExp(regExpEscape(str))
- Einfügen in eine Zeichenklasse. z.B.
new RegExp('[' + regExpEscape(str) + ']')
- Einfügen in einen Integer-Zähl-Spezifikator. z.B.
new RegExp('x{1,' + regExpEscape(str) + '}')
- Ausführung in nicht-JavaScript-regulären Ausdrucks-Engines.
Behandelte Sonderzeichen:
-
: Erzeugt ein Zeichenbereich in einer Zeichenklasse.
[
/ ]
: Startet / beendet eine Zeichenklasse.
{
/ }
: Startet / beendet einen Nummerierungsspezifikator.
(
/ )
: Startet / beendet eine Gruppe.
*
/ +
/ ?
: Spezifiziert den Wiederholungstyp.
.
: Passt auf jedes Zeichen.
\
: Escapiert Zeichen und startet Entitäten.
^
: Spezifiziert den Start des Übereinstimmungsbereichs und negiert das Matchen in einer Zeichenklasse.
$
: Spezifiziert das Ende des Übereinstimmungsbereichs.
|
: Spezifiziert Alternation.
#
: Spezifiziert einen Kommentar im free-spacing-Modus.
\s
: Im free-spacing-Modus ignoriert.
,
: Trennt Werte im Nummerierungsspezifikator.
/
: Startet oder beendet den Ausdruck.
:
: Vollendet spezielle Gruppentypen und Teil von Perl-style Zeichenklassen.
!
: Negiert Nullbreiten-Gruppe.
<
/ =
: Teil der Nullbreiten-Gruppenspezifikationen.
Anmerkungen:
/
ist in keiner Variante eines regulären Ausdrucks strikt notwendig. Es schützt jedoch, falls jemand (schauder) dies tut: eval("/" + pattern + "/");
.
,
stellt sicher, dass, wenn der String integer im numerischen Spezifikator sein soll, es richtig einen RegExp-Kompilierungsfehler verursacht anstatt stillschweigend falsch zu kompilieren.
#
und \s
müssen in JavaScript nicht escapet werden, aber in vielen anderen Varianten schon. Sie sind hier escapet, falls der reguläre Ausdruck später an ein anderes Programm übergeben wird.
Wenn Sie den regulären Ausdruck auch gegen potenzielle Ergänzungen der JavaScript-Regex-Engine-Funktionen zukunftssicher machen möchten, empfehle ich die sicherere Variante:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Diese Funktion escapet jedes Zeichen, außer denen, die explizit garantiert nicht für die Syntax in zukünftigen regulären Ausdrucksvarianten verwendet werden.
Für diejenigen, die wirklich auf Reinlichkeit bedacht sind, erwägen Sie diesen Spezialfall:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Dies sollte in JavaScript gut kompilieren, aber in einigen anderen Varianten nicht. Wenn die Absicht besteht, es an eine andere Variante weiterzugeben, sollte der Nullfall von s === ''
unabhängig überprüft werden, wie folgt:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
18 Stimmen
Ich wollte euch feine Leute nur darüber informieren, dass
RegExp.escape
derzeit bearbeitet wird und jeder, der meint, wertvolle Beiträge leisten zu können, ist herzlich eingeladen, mitzuwirken. core-js und andere Polyfills bieten es an.8 Stimmen
Gemäß dem aktuellen Update dieser Antwort wurde dieser Vorschlag abgelehnt: Siehe das Problem
1 Stimmen
Ja, ich glaube, dass @BenjaminGruenbaum derjenige sein könnte, der den Vorschlag vorgebracht hat. Ich habe versucht, Codebeispiele und das es-shim npm-Modul in einer Antwort auf Stack Overflow hier einzufügen: [ stackoverflow.com/a/63838890/5979634 ], weil der Vorschlag leider abgelehnt wurde. Hoffentlich ändern sie ihre Meinung oder jemand implementiert 'Template-Tags', bevor ich in Rente gehe.