Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

RegExp.escape()

Baseline 2025
Neu verfügbar

Seit May 2025 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.

Die statische Methode RegExp.escape() escaped alle potenziellen Regex-Syntaxzeichen in einem String und gibt einen neuen String zurück, der sicher als Literal-Muster für den RegExp() Konstruktor verwendet werden kann.

Wenn Sie dynamisch ein RegExp mit benutzerdefiniertem Inhalt erstellen, sollten Sie diese Funktion verwenden, um die Eingabe zu bereinigen (es sei denn, die Eingabe soll tatsächlich Regex-Syntax enthalten). Außerdem sollten Sie nicht versuchen, deren Funktionalität selbst zu implementieren, indem Sie beispielsweise String.prototype.replaceAll() verwenden, um ein \ vor allen Syntaxzeichen einzufügen. RegExp.escape() ist dafür ausgelegt, Escape-Sequenzen zu verwenden, die in vielen mehr Randfällen/Kontexten funktionieren, als handgefertigter Code wahrscheinlich erreichen würde.

Syntax

js
RegExp.escape(string)

Parameter

string

Der zu escapenende String.

Rückgabewert

Ein neuer String, der sicher als Literal-Muster für den RegExp() Konstruktor verwendet werden kann. Dabei werden folgende Dinge im Eingabestring ersetzt:

  • Das erste Zeichen des Strings, wenn es sich um eine Dezimalziffer (0–9) oder einen ASCII-Buchstaben (a–z, A–Z) handelt, wird mithilfe der \x Zeichen-Escape-Syntax escaped. Zum Beispiel gibt RegExp.escape("foo") "\\x66oo" zurück (hier und im Folgenden stehen die beiden Backslashes in einem String-Literal für ein einzelnes Backslash-Zeichen). Dieser Schritt stellt sicher, dass wenn dieser escapete String in ein größeres Muster eingebettet wird, wo es unmittelbar von \1, \x0, \u000 usw. gefolgt wird, das führende Zeichen nicht als Teil der Escape-Sequenz interpretiert wird.
  • Regex Syntaxzeichen, einschließlich ^, $, \, ., *, +, ?, (, ), [, ], {, }, und |, sowie der /-Begrenzer, werden durch Einfügen eines \-Zeichens davor escaped. Zum Beispiel gibt RegExp.escape("foo.bar") "\\x66oo\\.bar" zurück, und RegExp.escape("(foo)") gibt "\\(foo\\)" zurück.
  • Andere Satzzeichen, einschließlich ,, -, =, <, >, #, &, !, %, :, ;, @, ~, ', `, und ", werden mit der \x-Syntax escaped. Zum Beispiel gibt RegExp.escape("foo-bar") "\\x66oo\\x2dbar" zurück. Diese Zeichen können nicht durch Voranstellen eines \-Zeichens escapen werden, da, beispielsweise, /foo\-bar/u ein Syntaxfehler ist.
  • Die Zeichen mit ihren eigenen Zeichen-Escape-Sequenzen: \f (U+000C FORM FEED), \n (U+000A LINE FEED), \r (U+000D CARRIAGE RETURN), \t (U+0009 CHARACTER TABULATION), und \v (U+000B LINE TABULATION), werden durch ihre Escape-Sequenzen ersetzt. Zum Beispiel gibt RegExp.escape("foo\nbar") "\\x66oo\\nbar" zurück.
  • Das Leerzeichen wird als "\\x20" escaped.
  • Andere nicht-ASCII Zeilenumbrüche und Leerzeichen werden durch eine oder zwei \uXXXX-Escape-Sequenzen ersetzt, die ihre UTF-16-Codeunits repräsentieren. Zum Beispiel gibt RegExp.escape("foo\u2028bar") "\\x66oo\\u2028bar" zurück.
  • Einsame Surrogates werden durch ihre \uXXXX-Escape-Sequenzen ersetzt. Zum Beispiel gibt RegExp.escape("foo\uD800bar") "\\x66oo\\ud800bar" zurück.

Ausnahmen

TypeError

Wird ausgelöst, wenn string kein String ist.

Beispiele

Verwendung von RegExp.escape()

Die folgenden Beispiele zeigen verschiedene Eingaben und Ausgaben für die RegExp.escape() Methode.

js
RegExp.escape("Buy it. use it. break it. fix it.");
// "\\x42uy\\x20it\\.\\x20use\\x20it\\.\\x20break\\x20it\\.\\x20fix\\x20it\\."
RegExp.escape("foo.bar"); // "\\x66oo\\.bar"
RegExp.escape("foo-bar"); // "\\x66oo\\x2dbar"
RegExp.escape("foo\nbar"); // "\\x66oo\\nbar"
RegExp.escape("foo\uD800bar"); // "\\x66oo\\ud800bar"
RegExp.escape("foo\u2028bar"); // "\\x66oo\\u2028bar"

Verwendung von RegExp.escape() mit dem RegExp-Konstruktor

Der Hauptverwendungszweck von RegExp.escape() ist, wenn Sie einen String in ein größeres Regex-Muster einbetten möchten und sicherstellen wollen, dass der String als Literalmuster behandelt wird, nicht als Regex-Syntax. Betrachten Sie das folgende naive Beispiel, das URLs ersetzt:

js
function removeDomain(text, domain) {
  return text.replace(new RegExp(`https?://${domain}(?=/)`, "g"), "");
}

const input =
  "Consider using [RegExp.escape()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string.";
const domain = "developer.mozilla.org";
console.log(removeDomain(input, domain));
// Consider using [RegExp.escape()](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string.

Das Einfügen der domain oben ergibt das reguläre Ausdrucksliteral https?://developer.mozilla.org(?=/), wobei das "."-Zeichen ein Regex Wildcard-Zeichen ist. Das bedeutet, dass der String mit jedem Zeichen anstelle des "." übereinstimmen würde, wie developer-mozilla-org. Daher würde es fälschlicherweise auch den folgenden Text ändern:

js
const input =
  "This is not an MDN link: https://developer-mozilla.org/, be careful!";
const domain = "developer.mozilla.org";
console.log(removeDomain(input, domain));
// This is not an MDN link: /, be careful!

Um dies zu beheben, können wir RegExp.escape() verwenden, um sicherzustellen, dass jede Benutzereingabe als Literalmuster behandelt wird:

js
function removeDomain(text, domain) {
  return text.replace(
    new RegExp(`https?://${RegExp.escape(domain)}(?=/)`, "g"),
    "",
  );
}

Jetzt wird diese Funktion genau das tun, was wir beabsichtigen, und wird keine developer-mozilla.org-URLs verändern.

Spezifikationen

Spezifikation
ECMAScript® 2027 Language Specification
# sec-regexp.escape

Browser-Kompatibilität

Siehe auch