Start · Sprachen · JavaScript · Referenz · RegExp.lastParen ($+)

RegExp.lastParen ($+)

Eigenschaft

Die statische, schreibgeschützte Eigenschaft <code>RegExp.lastParen</code> (Alias <code>RegExp["$+"]</code>) liefert die letzte Erfassungsgruppe des zuletzt erfolgreichen Treffers.

seit JavaScript Legacy-Feature (nicht standardisiert, in allen Bro deprecated seit ja Kategorie: method-property

Signatur

get RegExp.lastParen

Beschreibung

RegExp.lastParen ist eine statische Zugriffs-Eigenschaft des globalen RegExp-Konstruktors. Sie gehört also nicht zu einer einzelnen Regex-Instanz. Nach jedem erfolgreichen Treffer, etwa durch exec(), test(), String.prototype.match() oder replace(), speichert die JavaScript-Engine dort den Inhalt der letzten Erfassungsgruppe. Gemeint ist die Gruppe mit der höchsten Nummer, nicht die Gruppe, die zeitlich zuletzt gepasst hat.

Die Eigenschaft hat den Alias RegExp["$+"]. Weil + in einem Bezeichner nicht erlaubt ist, funktioniert hier nur die Klammer-Schreibweise. RegExp.$+ ist ein Syntaxfehler.

Hat der Ausdruck keine Erfassungsgruppen oder hat die letzte Gruppe beim Treffer nicht mitgewirkt, ist der Wert ein leerer String "". Ein fehlgeschlagener Treffer lässt den vorherigen Wert unverändert.

Die Eigenschaft stammt aus den frühen Tagen von JavaScript und ist veraltet. Sie beruht auf globalem, veränderlichem Zustand. Im modernen Code greift man stattdessen direkt auf das Ergebnis-Array von exec() bzw. match() zu, zum Beispiel mit match.at(-1), oder man verwendet benannte Gruppen (match.groups).

Rückgabewert

Typ
string
Beschreibung
Den Inhalt der Erfassungsgruppe mit der höchsten Nummer aus dem zuletzt erfolgreichen Treffer. Gibt es keine solche Gruppe oder hat sie nicht mitgewirkt, ist der Wert "".

Beispiele

Letzte Gruppe nach einem Treffer auslesen

const re = /(\w+)\s(\w+)/;
re.test("Max Mustermann");

console.log(RegExp.lastParen);
console.log(RegExp["$+"]); // Alias, nur in Klammer-Schreibweise
Mustermann Mustermann

Nicht beteiligte letzte Gruppe und Ausdruck ohne Gruppen

// Gruppe 2 wirkt nicht mit, deshalb ist das Ergebnis leer
/(a)|(b)/.exec("a");
console.log(JSON.stringify(RegExp.lastParen));

// Ausdruck ohne Erfassungsgruppen
/\d+/.exec("Version 42");
console.log(JSON.stringify(RegExp.lastParen));
"" ""

Fallstrick: globaler Zustand wird überschrieben

const parseDatum = (s) => {
  /(\d{2})\.(\d{2})\.(\d{4})/.test(s);
  logge("Datum geprüft"); // führt intern selbst einen Treffer aus
  return RegExp.lastParen; // gedacht war das Jahr
};

const logge = (msg) => {
  /(\w+)/.test(msg); // überschreibt RegExp.lastParen
};

console.log(parseDatum("24.12.2024"));
Datum

Moderne Alternative ohne globalen Zustand

const re = /(?<tag>\d{2})\.(?<monat>\d{2})\.(?<jahr>\d{4})/;
const m = re.exec("24.12.2024");

if (m) {
  console.log(m.at(-1));      // letzte Gruppe über das Ergebnis-Array
  console.log(m.groups.jahr); // benannte Gruppe
}
2024 2024

// Wichtig · Fallstricke

  • Veraltet: Die Eigenschaft ist nicht Teil des eigentlichen ECMAScript-Standards. Sie wird nur im Proposal „Legacy RegExp features“ beschrieben. Browser und Node.js unterstützen sie aus Kompatibilitätsgründen, in neuem Code sollte man sie aber nicht verwenden.
  • Globaler Zustand: Jeder erfolgreiche Treffer im selben Realm überschreibt den Wert, auch Treffer in Bibliotheken, Hilfsfunktionen oder nach einem await. Der Wert ist deshalb leicht fehleranfällig und schwer nachzuvollziehen.
  • Nur Klammer-Schreibweise für den Alias: RegExp["$+"] funktioniert, RegExp.$+ ist ein Syntaxfehler.
  • „Letzte“ heißt „höchste Nummer“: Gemeint ist nicht die zuletzt passende Gruppe. Hat die höchste Gruppe nicht mitgewirkt, ist das Ergebnis "", auch wenn eine frühere Gruppe gepasst hat.
  • Unterklassen: Laut Proposal aktualisieren nur Instanzen des eingebauten RegExp des jeweiligen Realms die Legacy-Eigenschaften. Nach Treffern mit Unterklassen von RegExp kann der Zugriff einen TypeError auslösen.
  • Die Eigenschaft ist schreibgeschützt (nur ein Getter). Eine Zuweisung hat keine Wirkung und wirft im Strict Mode einen TypeError.