Signatur
Beschreibung
RegExp.prototype.toString() baut aus einem regulären Ausdruck einen String in der bekannten Literal-Form: Schrägstrich, Muster, Schrägstrich, Flags. Intern liest die Methode die Eigenschaften source und flags und setzt daraus "/" + source + "/" + flags zusammen. Die Methode überschreibt Object.prototype.toString(). Deshalb liefern String(regex), Template-Literale und die String-Verkettung mit + automatisch diese Darstellung.
Nützlich ist das beim Logging und Debugging, beim Anzeigen von Validierungsregeln in Oberflächen und beim Serialisieren von Mustern. JSON.stringify() macht aus einem RegExp-Objekt nämlich nur {}. Wer ein Muster speichern oder übertragen will, nimmt toString() oder besser gleich source und flags getrennt.
Die Ausgabe ist normalisiert. Die Flags stehen immer in einer festen Reihenfolge (dgimsuvy), egal in welcher Reihenfolge man sie angegeben hat. Schrägstriche und Zeilenumbrüche im Muster werden maskiert (\/, \n), damit der String wieder ein gültiges Literal ergibt. Ein leeres Muster erscheint als /(?:)/.
Die Methode ist generisch: Sie funktioniert mit jedem Objekt, das die Eigenschaften source und flags besitzt. Ein echtes RegExp-Objekt muss es nicht sein.
Rückgabewert
"/source/flags", also das Muster des regulären Ausdrucks in Literal-Schreibweise.Beispiele
Grundlegende Ausgabe und implizite Umwandlung
const plz = /^\d{5}$/g;
console.log(plz.toString());
console.log(String(plz));
console.log(`Regel: ${plz}`);
// Mit new RegExp erzeugt: gleiche Darstellung
const wort = new RegExp('hallo', 'i');
console.log(wort.toString());
Normalisierung: Flag-Reihenfolge, Maskierung, leeres Muster
// Flags werden in fester Reihenfolge ausgegeben
console.log(new RegExp('abc', 'yig').toString());
// Schrägstrich im Muster wird maskiert
console.log(new RegExp('pfad/zu/datei').toString());
// Zeilenumbruch wird als \n dargestellt
console.log(new RegExp('\n').toString());
// Leeres Muster
console.log(new RegExp('').toString());
Regeln serialisieren und wiederherstellen
const regeln = { email: /^[^@\s]+@[^@\s]+\.[a-z]{2,}$/i };
// JSON.stringify kennt RegExp nicht und liefert {}
console.log(JSON.stringify(regeln));
// Stattdessen per toString() serialisieren
const json = JSON.stringify(regeln, (key, value) =>
value instanceof RegExp ? value.toString() : value
);
console.log(json);
// Wiederherstellen: am letzten '/' trennen
const parseRegExp = (str) => {
const ende = str.lastIndexOf('/');
return new RegExp(str.slice(1, ende), str.slice(ende + 1));
};
const geladen = parseRegExp(JSON.parse(json).email);
console.log(geladen.test('Max@Beispiel.de'));
Generischer Aufruf mit eigenem Objekt
const pseudo = { source: 'foo|bar', flags: 'gi' };
console.log(RegExp.prototype.toString.call(pseudo));
// Wichtig · Fallstricke
- Nicht mit
sourceverwechseln:toString()liefert Schrägstriche und Flags mit.regex.sourceenthält nur das Muster. Beim Serialisieren ist es am robustesten,sourceundflagsgetrennt zu speichern. Dann entfällt das Zerlegen des Strings. - Kein
eval()zum Wiederherstellen: Einen gespeicherten String wie"/abc/g"sollte man nicht pereval()odernew Function()zurückverwandeln. Stammt der String aus einer fremden Quelle, ist das eine Sicherheitslücke, und eine strenge CSP blockiert es ohnehin. Verwenden Sie stattdessennew RegExp(source, flags). Bei Mustern von Nutzern oder aus fremden Quellen droht außerdem ReDoS, also katastrophales Backtracking. lastIndexgeht verloren: Der Zustand eines Ausdrucks mitg- odery-Flag ist nicht Teil des Strings.- Ältere Engines: Vor ES5 wurden
/im Muster nicht überall maskiert. Vor ES2015 bestand die Ausgabe nur aussourceund den Einzel-Flagsg,iundm. Neuere Flags wied(ES2022) undv(ES2024) erscheinen nur in Engines, die sie unterstützen. - Wird die Methode mit einem Wert aufgerufen, der kein Objekt ist, wirft sie einen
TypeError, zum Beispiel beiRegExp.prototype.toString.call('abc').