Signatur
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 (\xHHbzw.\uHHHH) kodiert. - Steht am Anfang ein Buchstabe oder eine Ziffer, wird auch dieses Zeichen als
\xHHkodiert. So kann der Text sicher hinter einem\0,\1oder\ceingefü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
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 €"));
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++"));
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));
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"));
// Wichtig · Fallstricke
- Kein automatisches Umwandeln: Wird kein String übergeben, zum Beispiel eine Zahl,
nulloderundefined, wirft die Methode einenTypeError. Wandle den Wert vorher mitString(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()undreplaceAll()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.