Start · Sprachen · JavaScript · Referenz · RegExp.escape()

RegExp.escape()

Methode

Escaped alle Regex-Syntaxzeichen in einem String und gibt einen neuen String zurück, der sicher als wörtliches Muster in <code>new RegExp()</code> verwendet werden kann.

seit JavaScript ES2025 (Baseline 2025: Chrome 136, Firefox 134, Sa Kategorie: method-property

Signatur

RegExp.escape(string)

Beschreibung

RegExp.escape() ist eine statische Methode des RegExp-Konstruktors. Sie nimmt einen beliebigen String und maskiert alle Zeichen, die in einem regulären Ausdruck eine Sonderbedeutung haben könnten. So erhält man ein Muster, das genau auf den ursprünglichen Text passt – ohne dass Zeichen wie ., *, ( oder $ als Regex-Syntax gelesen werden.

Man braucht die Methode immer dann, wenn man einen regulären Ausdruck dynamisch aus Werten baut, die man nicht selbst kontrolliert: Suchbegriffe aus Nutzereingaben, Dateinamen, URLs, Preise wie 9.99 oder Programmiersprachen-Namen wie C++. Bisher musste man dafür eine eigene Hilfsfunktion wie str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") schreiben, die oft unvollständig war.

Die Methode geht gründlicher vor als die üblichen Selbstbau-Lösungen:

  • Syntaxzeichen ^ $ \ . * + ? ( ) [ ] { } | und / bekommen einen vorangestellten Backslash.
  • Weitere Satzzeichen wie , - = < > # & ! % : ; @ ~ ' ` " sowie Leerraum werden als Hex-Escape (\xHH bzw. \uHHHH) kodiert.
  • Steht am Anfang ein Buchstabe oder eine Ziffer, wird auch dieses Zeichen als \xHH kodiert. So kann der Text sicher hinter einem \0, \1 oder \c eingefügt werden, ohne mit ihnen zu verschmelzen.

Das Ergebnis ist in jedem Kontext eines Musters gültig, sowohl mit als auch ohne die Flags u und v.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der String, dessen Zeichen maskiert werden sollen. Es muss ein echter String sein. Andere Typen werden nicht automatisch umgewandelt.

Rückgabewert

Typ
string
Beschreibung
Ein neuer String, in dem alle potenziellen Regex-Syntaxzeichen maskiert sind. Er eignet sich als wörtliches Muster für new RegExp(). Der ursprüngliche String bleibt unverändert.

Beispiele

Grundlegende Maskierung

console.log(RegExp.escape("(1+1)"));
console.log(RegExp.escape("C++"));

// Ohne Escape wäre "." ein beliebiges Zeichen
const preis = "9.99";
const re = new RegExp(RegExp.escape(preis));
console.log(re.test("Kostet 9.99 €"));
console.log(re.test("Kostet 9x99 €"));
\(1\+1\) \x43\+\+ true false

Suchbegriff aus Nutzereingabe hervorheben

const highlight = (text, term) => {
  if (!term) return text;
  const re = new RegExp(RegExp.escape(term), "gi");
  return text.replace(re, (treffer) => `<mark>${treffer}</mark>`);
};

console.log(highlight("Wir lernen C++ und c++ ist toll.", "c++"));
Wir lernen <mark>C++</mark> und <mark>c++</mark> ist toll.

Ganze Wörter mit Wortgrenzen finden

const woerter = ["a.b", "x*y"];
const muster = woerter.map((w) => RegExp.escape(w)).join("|");
const re = new RegExp(`\\b(?:${muster})\\b`, "g");

const text = "Werte: a.b, axb, x*y und x**y";
console.log(text.match(re));
[ 'a.b', 'x*y' ]

Feature-Erkennung mit Fallback

const escapeRegExp = typeof RegExp.escape === "function"
  ? RegExp.escape
  : (s) => s.replace(/[\\^$.*+?()[\]{}|\/]/g, "\\$&");

const dateiname = "bericht(2024).pdf";
const re = new RegExp(`^${escapeRegExp(dateiname)}$`);
console.log(re.test("bericht(2024).pdf"));
true

// Wichtig · Fallstricke

  • Kein automatisches Umwandeln: Wird kein String übergeben, zum Beispiel eine Zahl, null oder undefined, wirft die Methode einen TypeError. Wandle den Wert vorher mit String(wert) um.
  • Das Ergebnis sieht ungewohnt aus: RegExp.escape("foo") ergibt "\x66oo", weil das erste Zeichen ein Buchstabe ist. Auch Leerzeichen werden zu \x20. Das ist gewollt und am Ende passt das Muster genau auf den Originaltext. Man sollte den Rückgabewert aber nicht mit einer handgeschriebenen Zeichenkette vergleichen.
  • Nur für das Muster gedacht: Für den Ersetzungsstring von replace() und replaceAll() ist die Methode ungeeignet. Dort hat $ eine eigene Bedeutung ($&, $1). Maskiere es dort mit $$ oder nutze eine Ersetzungsfunktion.
  • Sicherheit: Die Methode verhindert, dass Nutzereingaben die Regex-Logik verändern. Dazu gehört auch ReDoS durch eingeschleuste Quantoren wie (a+)+. Sie schützt jedoch nicht vor XSS. Wenn du Treffer in HTML einfügst, musst du den Text zusätzlich HTML-escapen.
  • Kompatibilität: Die Methode ist neu seit ES2025 und läuft ab Chrome/Edge 136, Firefox 134, Safari 18.2 und Node.js 24. Für ältere Umgebungen brauchst du ein Polyfill, etwa aus core-js, oder einen Fallback wie im Beispiel oben.