Signatur
Beschreibung
RegExp.input ist eine statische Zugriffs-Eigenschaft des RegExp-Konstruktors. Sie gehört nicht zu einzelnen RegExp-Instanzen. Sie enthält die Eingabezeichenkette des letzten erfolgreichen Abgleichs, egal ob er mit exec(), test(), String.prototype.match(), replace(), search() oder split() ausgeführt wurde. RegExp.$_ ist ein gleichwertiger Alias. Wegen des $ im Namen kann man ihn nur mit Punktnotation ansprechen. Die Schreibweise RegExp["$_"] funktioniert ebenfalls.
Die Eigenschaft stammt aus frühen JavaScript-Versionen, die sich an Perl orientierten. Sie gehört zu den sogenannten Legacy-RegExp-Features, genauso wie RegExp.$1–$9, RegExp.lastMatch, RegExp.leftContext und RegExp.rightContext. Ihr Wert ist globaler Zustand, den sich der gesamte Realm teilt. Jeder spätere erfolgreiche Abgleich überschreibt ihn, auch einer in Bibliothekscode.
In neuem Code solltest du RegExp.input nicht verwenden. Die Eingabezeichenkette steht direkt am Ergebnis-Array von exec() und match() zur Verfügung, nämlich über die Eigenschaft input. Du kannst sie auch einfach in einer eigenen Variablen halten. Die Eigenschaft ist höchstens zum Verständnis von Altcode nützlich.
Rückgabewert
"". Es gibt auch einen Setter: Ein zugewiesener Wert wird in einen String umgewandelt.Beispiele
Eingabe des letzten Abgleichs auslesen
const re = /welt/i;
re.test('Hallo Welt!');
console.log(RegExp.input);
console.log(RegExp.$_);
Fehlgeschlagene Abgleiche ändern den Wert nicht
/\d+/.test('Bestellnummer 4711');
console.log(RegExp.input);
// Kein Treffer: der alte Wert bleibt stehen
/xyz/.test('abc');
console.log(RegExp.input);
// Jeder andere erfolgreiche Abgleich überschreibt ihn
'foo-bar'.replace(/-/, '_');
console.log(RegExp.input);
Moderne Alternative: input-Eigenschaft des Treffers
const text = 'Preis: 19,99 EUR';
const treffer = text.match(/(\d+),(\d+)/);
if (treffer) {
// Ohne globalen Zustand, sicher auch bei parallelem Code
console.log(treffer.input);
console.log(treffer.index, treffer[0]);
}
// Wichtig · Fallstricke
- Veraltet: Die Eigenschaft steht nicht im ECMAScript-Standard. Es gibt nur einen TC39-Vorschlag für „Legacy RegExp features“, der das Verhalten festschreibt. Die Engines unterstützen sie weiterhin, aber verlass dich in neuem Code nicht darauf.
- Globaler Zustand: Jeder erfolgreiche Abgleich im selben Realm überschreibt den Wert, auch einer in Bibliotheken, Callbacks oder nach einem
await. Das führt leicht zu schwer auffindbaren Fehlern. - Datenschutz/Sicherheit: Hat dein Code sensible Daten per RegExp geprüft, etwa Passwörter oder Tokens, kann anderer Code im selben Realm sie über
RegExp.inputauslesen. - Unterklassen: Nach dem Vorschlag setzen Abgleiche mit Unterklassen von
RegExpdie Legacy-Eigenschaften ungültig. Ein Zugriff kann dann einenTypeErrorwerfen. Wie sich die Engines hier verhalten, ist nicht überall gleich. - Nur Punktnotation oder
RegExp[\"$_\"]funktionieren. Ein nacktes$_ist dagegen eine gewöhnliche Variable und hat mitRegExpnichts zu tun.