Start · Sprachen · JavaScript · Referenz · RegExp.input ($_)

RegExp.input ($_)

Eigenschaft

Die statische, veraltete Eigenschaft <code>RegExp.input</code> (Alias <code>RegExp.$_</code>) liefert die Zeichenkette, gegen die zuletzt erfolgreich ein regulärer Ausdruck abgeglichen wurde.

seit JavaScript JavaScript 1.2 (veraltet, nicht standardisiert; in deprecated seit ja Kategorie: method-property

Signatur

get RegExp.input / get RegExp.$_

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

Typ
string
Beschreibung
Die Zeichenkette des letzten erfolgreichen Abgleichs. Solange noch kein Abgleich erfolgreich war, ist der Wert ein leerer String "". 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.$_);
Hallo Welt! Hallo Welt!

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);
Bestellnummer 4711 Bestellnummer 4711 foo-bar

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]);
}
Preis: 19,99 EUR 7 19,99

// 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.input auslesen.
  • Unterklassen: Nach dem Vorschlag setzen Abgleiche mit Unterklassen von RegExp die Legacy-Eigenschaften ungültig. Ein Zugriff kann dann einen TypeError werfen. 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 mit RegExp nichts zu tun.