698 Stimmen

Escape-String zur Verwendung in Javascript-Regex

Mögliches Duplikat:
Gibt es eine RegExp.escape-Funktion in Javascript?

Ich versuche, ein Javascript Regex auf der Grundlage von Benutzereingaben zu bauen:

function FindString(input) {
    var reg = new RegExp('' + input + '');
    // \[snip\] perform search
}

Die Regex funktioniert jedoch nicht korrekt, wenn die Benutzereingabe ein ? o * weil sie als Regex-Specials interpretiert werden. Wenn der Benutzer eine unausgewogene ( o [ in ihrer Zeichenkette, ist die Regex nicht einmal gültig.

Was ist die Javascript-Funktion, um korrekt alle Sonderzeichen für die Verwendung in regex entkommen?

1403voto

coolaj86 Punkte 69032

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")
}());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X