Signatur
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
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);
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);
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));
// Wichtig · Fallstricke
- Nur lesbar: Eine Zuweisung wie
re.hasIndices = truehat keine Wirkung. Im Strict Mode löst sie einenTypeErroraus, 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
indicesder Wertundefined. match()mitg: Diese Kombination liefert ein einfaches Array ohneindices. Nutze stattdessenmatchAll()oderexec().- Kompatibilität: Unterstützt seit ES2022, Chrome/Edge 90, Firefox 88, Safari 15 und Node.js 16. Ältere Engines werfen beim Literal
/x/deinenSyntaxError. LiefertRegExp.prototype.hasIndicesselbst den Wertundefined, wird das Flag nicht unterstützt.