Start · Sprachen · JavaScript · Referenz · RegExp.prototype.toString()

RegExp.prototype.toString()

Methode

Gibt einen String in Literal-Schreibweise zurück, also <code>"/muster/flags"</code>, der den regulären Ausdruck darstellt.

seit JavaScript ES1 (Baseline: alle Browser); generisches Verhalte Kategorie: method-property

Signatur

RegExp.prototype.toString()

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

Typ
string
Beschreibung
Ein String der Form "/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());
/^\d{5}$/g /^\d{5}$/g Regel: /^\d{5}$/g /hallo/i

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());
/abc/giy /pfad\/zu\/datei/ /\n/ /(?:)/

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'));
{"email":{}} {"email":"/^[^@\\s]+@[^@\\s]+\\.[a-z]{2,}$/i"} true

Generischer Aufruf mit eigenem Objekt

const pseudo = { source: 'foo|bar', flags: 'gi' };

console.log(RegExp.prototype.toString.call(pseudo));
/foo|bar/gi

// Wichtig · Fallstricke

  • Nicht mit source verwechseln: toString() liefert Schrägstriche und Flags mit. regex.source enthält nur das Muster. Beim Serialisieren ist es am robustesten, source und flags getrennt zu speichern. Dann entfällt das Zerlegen des Strings.
  • Kein eval() zum Wiederherstellen: Einen gespeicherten String wie "/abc/g" sollte man nicht per eval() oder new Function() zurückverwandeln. Stammt der String aus einer fremden Quelle, ist das eine Sicherheitslücke, und eine strenge CSP blockiert es ohnehin. Verwenden Sie stattdessen new RegExp(source, flags). Bei Mustern von Nutzern oder aus fremden Quellen droht außerdem ReDoS, also katastrophales Backtracking.
  • lastIndex geht verloren: Der Zustand eines Ausdrucks mit g- oder y-Flag ist nicht Teil des Strings.
  • Ältere Engines: Vor ES5 wurden / im Muster nicht überall maskiert. Vor ES2015 bestand die Ausgabe nur aus source und den Einzel-Flags g, i und m. Neuere Flags wie d (ES2022) und v (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 bei RegExp.prototype.toString.call('abc').