Kurz und bündig (Aktualisiert 2021)
Um der RegExp selbst zu entkommen:
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
Um eine Ersetzungszeichenfolge zu umgehen:
function escapeReplacement(string) {
return string.replace(/\$/g, '$$$$');
}
Exemple
Alle escapeten RegExp-Zeichen:
escapeRegExp("All of these should be escaped: \ ^ $ * + ? . ( ) | { } [ ]");
>>> "All of these should be escaped: \\ \^ \$ \* \+ \? \. \( \) \| \{ \} \[ \] "
Suchen und Ersetzen einer Zeichenfolge:
var haystack = "I love $x!";
var needle = "$x";
var safeNeedle = escapeRegExp(needle); // "\\$x"
var replacement = "$100 bills"
var safeReplacement = escapeReplacement(replacement); // "$$100 bills"
haystack.replace(
new RegExp(safeNeedle, 'g'),
escapeReplacement(safeReplacement),
);
// "I love $100 bills!"
( ANMERKUNG : Die obige Antwort ist nicht die Originalantwort; sie wurde bearbeitet, um die eine von MDN . Dies bedeutet, dass es no mit dem Code im unten stehenden npm übereinstimmt, und no mit den Angaben in der nachstehenden langen Antwort übereinstimmen. Auch die Kommentare sind jetzt verwirrend. Meine Empfehlung: Verwenden Sie die obige Antwort, oder holen Sie sie sich von MDN, und ignorieren Sie den Rest dieser Antwort. -Darren,Nov 2019)
Installieren Sie
Verfügbar auf npm als escape-string-regexp
npm install --save escape-string-regexp
Note
Ver MDN: Javascript-Anleitung: Reguläre Ausdrücke
Andere Symbole (~`!@# ...) KÖNNEN ohne Folgen escaped werden, müssen es aber nicht.
.
.
.
.
Testfall: Eine typische Url
escapeRegExp("/path/to/resource.html?search=query");
>>> "\/path\/to\/resource\.html\?search=query"
Die lange Antwort
Wenn Sie die obige Funktion verwenden wollen, sollten Sie zumindest in der Dokumentation Ihres Codes auf diesen Stack-Overflow-Beitrag verweisen, damit es nicht wie verrücktes, schwer zu testendes Voodoo aussieht.
var escapeRegExp;
(function () {
// Referring to the table here:
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp
// these characters should be escaped
// \ ^ $ * + ? . ( ) | { } [ ]
// These characters only have special meaning inside of brackets
// they do not need to be escaped, but they MAY be escaped
// without any adverse effects (to the best of my knowledge and casual testing)
// : ! , =
// my test "~!@#$%^&*(){}[]`/=?+\|-_;:'\",<.>".match(/[\#]/g)
var specials = [
// order matters for these
"-"
, "["
, "]"
// order doesn't matter for any of these
, "/"
, "{"
, "}"
, "("
, ")"
, "*"
, "+"
, "?"
, "."
, "\\"
, "^"
, "$"
, "|"
]
// I choose to escape every character with '\'
// even though only some strictly require it when inside of []
, regex = RegExp('[' + specials.join('\\') + ']', 'g')
;
escapeRegExp = function (str) {
return str.replace(regex, "\\$&");
};
// test escapeRegExp("/path/to/res?search=this.that")
}());