Start · Sprachen · JavaScript · Referenz · RegExp.leftContext ($`)

RegExp.leftContext ($`)

Eigenschaft

Die statische Eigenschaft <code>RegExp.leftContext</code> (Alias <code>RegExp["$`"]</code>) liefert den Teil des Strings, der vor der zuletzt gefundenen Übereinstimmung steht.

seit JavaScript ES3-Ära (nicht standardisiert, Legacy-Feature); Ba deprecated seit ja Kategorie: method-property

Signatur

get RegExp.leftContext // Alias: RegExp["$`"]

Beschreibung

RegExp.leftContext ist eine statische, schreibgeschützte Zugriffs-Eigenschaft des globalen RegExp-Konstruktors. Sie enthält die Teilzeichenkette des durchsuchten Strings, die vor der zuletzt erfolgreichen Übereinstimmung steht. Der kurze Alias lautet RegExp["$`"]. Wegen des Backticks im Namen geht das nur über die Klammer-Schreibweise, RegExp.$` ist ein Syntaxfehler.

Der Wert wird bei jeder erfolgreichen Suche mit einem regulären Ausdruck neu gesetzt, also bei RegExp.prototype.exec(), test(), String.prototype.match(), replace(), search() und ähnlichen Methoden. Schlägt die Suche fehl, bleibt der alte Wert erhalten. Das Gegenstück ist RegExp.rightContext ($'), das den Rest nach der Übereinstimmung liefert.

Die Eigenschaft gehört zu den Legacy-RegExp-Features. Sie hängt an globalem Zustand und ist deshalb schwer nachzuvollziehen. In neuem Code sollte man den Präfix direkt aus dem Match-Ergebnis berechnen: match.input.slice(0, match.index). Bei String.prototype.replace() gibt es außerdem das gleichnamige Ersetzungsmuster $` im Ersetzungs-String. Das ist standardisiert und hängt nicht vom globalen Zustand ab.

Rückgabewert

Typ
string
Beschreibung
Die Teilzeichenkette vor der letzten erfolgreichen Übereinstimmung. Gab es noch keine Übereinstimmung, ist es ein leerer String "".

Beispiele

Grundlegende Nutzung und Alias

const re = /welt/;
re.test('Hallo welt, wie geht es?');

console.log(RegExp.leftContext);  // Langform
console.log(RegExp['$`']);        // Alias – nur in Klammer-Schreibweise
console.log(RegExp.rightContext); // Gegenstück
Hallo Hallo , wie geht es?

Moderne Alternative ohne globalen Zustand

const log = '2024-05-01 ERROR Datenbank nicht erreichbar';
const match = /ERROR/.exec(log);

if (match) {
  // Entspricht RegExp.leftContext, ist aber lokal und sicher
  const prefix = match.input.slice(0, match.index).trim();
  console.log(`Zeitstempel: ${prefix}`);
}
Zeitstempel: 2024-05-01

Ersetzungsmuster $` in replace()

// $` im Ersetzungs-String steht für den Text vor dem Treffer
const result = 'abc-def'.replace('-', '[$`]');
console.log(result);
abc[abc]def

Fallstrick: Wert wird von späteren Suchen überschrieben

/b/.test('abc');
const first = RegExp.leftContext; // 'a'

'xyz'.replace(/z/, '!'); // setzt den globalen Zustand neu
console.log(first, RegExp.leftContext);

/nichtda/.test('abc'); // fehlgeschlagen → Wert bleibt
console.log(RegExp.leftContext);
a xy xy

// Wichtig · Fallstricke

  • Nicht empfohlen: Die Eigenschaft ist ein Legacy-Feature und nicht Teil des eigentlichen ECMAScript-Standards. Es gibt nur einen Vorschlag („Legacy RegExp features“), sie zu standardisieren. Alle großen Engines (V8, SpiderMonkey, JavaScriptCore) und Node.js unterstützen sie trotzdem.
  • Globaler Zustand: Jede erfolgreiche Regex-Suche überschreibt den Wert, auch Suchen in Bibliotheken oder zwischen await-Punkten. Den Wert deshalb sofort auslesen oder besser match.input.slice(0, match.index) verwenden.
  • Syntax: RegExp.$` ist ungültig. Man muss RegExp["$`"] schreiben.
  • Unterklassen und Realms: Laut Legacy-Vorschlag wirft der Zugriff einen TypeError, wenn die letzte Suche von einer RegExp-Unterklasse oder aus einem anderen Realm stammte. Je nach Engine wird die Eigenschaft in diesen Fällen auch einfach nicht aktualisiert.
  • Nur lesbar: Es gibt keinen Setter. Zuweisungen haben keine Wirkung und werfen im Strict Mode einen TypeError.
  • Performance: Engines müssen den Eingabe-String für diese statischen Eigenschaften intern aufbewahren. Das kann Optimierungen verhindern.