Die meisten Ausdrücke hier lösen einzelne spezifische Anwendungsfälle.
Das ist okay, aber ich bevorzuge einen "immer funktionierenden" Ansatz.
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
Dadurch wird eine Literalzeichenfolge für eine der folgenden Verwendungen in regulären Ausdrücken "vollständig entzogen":
- 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 den Integer Count Specifier. Z.B
new RegExp('x{1,' + regExpEscape(str) + '}')
- Ausführung in Nicht-JavaScript-Engines für reguläre Ausdrücke.
Abgedeckte Sonderzeichen:
-
: Erstellt einen Zeichenbereich in einer Zeichenklasse.
[
/ ]
: Startet / beendet eine Zeichenklasse.
{
/ }
: Startet / beendet einen Nummerierungsspezifizierer.
(
/ )
: Startet / beendet eine Gruppe.
*
/ +
/ ?
: Gibt an Wiederholungstyp.
.
: Entspricht einem beliebigen Zeichen.
\
: Entkommt Zeichen und startet Entitäten.
^
: Gibt den Beginn der Übereinstimmungszone an und negiert die Übereinstimmung in einer Zeichenklasse.
$
: Gibt das Ende der Übereinstimmungszone an.
|
: Gibt den Wechsel an.
#
: Gibt einen Kommentar im freien Abstand an.
\s
: Im Freiraummodus ignoriert.
,
: Trennt Werte im Nummerierungsspezifizierer.
/
: Startet oder beendet den Ausdruck.
:
: Vervollständigt spezielle Gruppentypen und einen Teil der Zeichenklassen im Perl-Stil.
!
: Negiert die Gruppe mit der Breite Null.
<
/ =
: Teil der Gruppenspezifikationen mit der Breite Null.
Anmerkungen:
/
ist in keinem Geschmack des regulären Ausdrucks unbedingt erforderlich. Es schützt jedoch für den Fall, dass jemand (Schauder) dies tut eval("/" + pattern + "/");
.
,
stellt sicher, dass die Zeichenfolge, wenn sie im numerischen Bezeichner eine Ganzzahl sein soll, ordnungsgemäß einen RegExp-Kompilierungsfehler verursacht, anstatt stillschweigend falsch zu kompilieren.
#
und \s
müssen nicht in JavaScript maskiert werden, sondern in vielen anderen Varianten. Sie werden hier maskiert, falls der reguläre Ausdruck später an ein anderes Programm übergeben wird.
Wenn Sie den regulären Ausdruck auch gegen mögliche Ergänzungen der Funktionen der JavaScript-Regex-Engine zukunftssicher machen müssen, empfehle ich die Verwendung des paranoideren Ausdrucks:
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
Diese Funktion entgeht jedem Zeichen mit Ausnahme derjenigen, die ausdrücklich garantiert nicht für die Syntax in zukünftigen Varianten regulärer Ausdrücke verwendet werden.
Betrachten Sie diesen Randfall für wirklich sanitäre Menschen:
var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
Dies sollte in JavaScript gut kompiliert werden können, in einigen anderen Varianten jedoch nicht. Wenn beabsichtigt wird, zu einem anderen Geschmack überzugehen, sollte der Nullfall von s === ''
unabhängig überprüft werden, wie folgt:
var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');
RegExp.escape
auf dem Laufenden halten, an denen gerade gearbeitet wird, und jeder, der glaubt, wertvolle Beiträge zu leisten, ist herzlich eingeladen, einen Beitrag zu leisten. Core-Js und andere Polyfills bieten es an.