Start · Sprachen · JavaScript · Referenz · RegExp.prototype.hasIndices

RegExp.prototype.hasIndices

Eigenschaft

Gibt <code>true</code> zurück, wenn der reguläre Ausdruck mit dem <code>d</code>-Flag erzeugt wurde. Dann liefern Treffer zusätzlich Start- und Endindizes.

seit JavaScript ES2022 Kategorie: method-property

Signatur

get RegExp.prototype.hasIndices

Beschreibung

Die Accessor-Eigenschaft hasIndices zeigt an, ob ein RegExp-Objekt mit dem Flag d („indices“) erstellt wurde. Ist das Flag gesetzt, bekommen die Ergebnisse von exec(), String.prototype.match() (ohne g) und matchAll() eine zusätzliche Eigenschaft indices. Sie enthält für den Gesamttreffer und für jede Erfassungsgruppe ein Paar [start, end].

Das ist nützlich, wenn man nicht nur wissen möchte, was gefunden wurde, sondern auch wo. Typische Anwendungen sind Syntax-Hervorhebung, Fehlermarkierungen in Editoren, Tokenizer oder das gezielte Ersetzen einzelner Gruppen. Bei benannten Gruppen steht zusätzlich indices.groups zur Verfügung.

Die Eigenschaft ist nur lesbar: Es gibt einen Getter, aber keinen Setter. Das Flag lässt sich nach dem Erzeugen nicht mehr ändern. Wenn man es braucht, erzeugt man ein neues RegExp-Objekt, z. B. mit new RegExp(re.source, re.flags + 'd').

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das d-Flag gesetzt ist, sonst false.

Beispiele

Flag prüfen

const mitIndizes = /foo/d;
const ohneIndizes = /foo/g;

console.log(mitIndizes.hasIndices);
console.log(ohneIndizes.hasIndices);
console.log(mitIndizes.flags);
true false d

Positionen einer benannten Gruppe ermitteln

const re = /(?<jahr>\d{4})-(?<monat>\d{2})/d;
const text = 'Release: 2024-05';
const treffer = re.exec(text);

console.log(treffer.indices[0]);
console.log(treffer.indices.groups.jahr);
console.log(treffer.indices.groups.monat);
[ 9, 16 ] [ 9, 13 ] [ 14, 16 ]

Fundstellen hervorheben mit matchAll

const hervorheben = (text, re) => {
  // d-Flag nachrüsten, falls es fehlt
  const regex = re.hasIndices ? re : new RegExp(re.source, re.flags + 'd');
  let ergebnis = '';
  let letzte = 0;
  for (const m of text.matchAll(regex)) {
    const [start, ende] = m.indices[0];
    ergebnis += text.slice(letzte, start) + '[' + text.slice(start, ende) + ']';
    letzte = ende;
  }
  return ergebnis + text.slice(letzte);
};

console.log(hervorheben('Katze, Hund, Katze', /Katze/g));
[Katze], Hund, [Katze]

// Wichtig · Fallstricke

  • Nur lesbar: Eine Zuweisung wie re.hasIndices = true hat keine Wirkung. Im Strict Mode löst sie einen TypeError aus, weil es keinen Setter gibt.
  • Leistung: Das Berechnen der Indizes kostet zusätzlich Speicher und Rechenzeit. Setze das d-Flag deshalb nur, wenn du die Positionen wirklich brauchst.
  • Nicht gefundene Gruppen: Hat eine optionale Gruppe nichts erfasst, steht an ihrer Stelle in indices der Wert undefined.
  • match() mit g: Diese Kombination liefert ein einfaches Array ohne indices. Nutze stattdessen matchAll() oder exec().
  • Kompatibilität: Unterstützt seit ES2022, Chrome/Edge 90, Firefox 88, Safari 15 und Node.js 16. Ältere Engines werfen beim Literal /x/d einen SyntaxError. Liefert RegExp.prototype.hasIndices selbst den Wert undefined, wird das Flag nicht unterstützt.