Signatur
Beschreibung
flags ist eine schreibgeschützte Zugriffseigenschaft (Getter) auf RegExp.prototype. Sie gibt einen String mit allen Flags zurück, die für den regulären Ausdruck gesetzt sind. Ist kein Flag gesetzt, erhalten Sie einen leeren String "".
Die Flags stehen immer in einer festen Reihenfolge, egal in welcher Reihenfolge sie beim Erzeugen angegeben wurden: d (hasIndices), g (global), i (ignoreCase), m (multiline), s (dotAll), u (unicode), v (unicodeSets), y (sticky). Dadurch lassen sich zwei Ausdrücke zuverlässig über source und flags vergleichen.
Gebraucht wird flags vor allem, wenn Sie einen regulären Ausdruck klonen oder abwandeln wollen, zum Beispiel mit new RegExp(re.source, re.flags + "g"), oder wenn Sie prüfen müssen, ob ein bestimmtes Flag gesetzt ist, bevor Sie String.prototype.matchAll() oder replaceAll() aufrufen. Vor ES2015 musste man den Flag-String umständlich aus toString() herauslesen oder aus den einzelnen booleschen Eigenschaften zusammenbauen.
Intern liest der Getter die einzelnen Eigenschaften (hasIndices, global usw.) nacheinander aus. Deshalb funktioniert er generisch auch mit Unterklassen, die diese Eigenschaften überschreiben, und sogar mit gewöhnlichen Objekten.
Rückgabewert
dgimsuvy, oder "", wenn kein Flag gesetzt ist.Beispiele
Flags auslesen – Reihenfolge ist normiert
const re1 = /hallo/gi;
const re2 = new RegExp('welt', 'ymsg');
const re3 = /ohne/;
console.log(re1.flags);
console.log(re2.flags); // sortiert, nicht in Eingabereihenfolge
console.log(re3.flags === '');
Regex klonen und das g-Flag für matchAll ergänzen
// matchAll() wirft einen TypeError ohne g-Flag, daher ergänzen wir es bei Bedarf
const ensureGlobal = (re) =>
re.flags.includes('g') ? re : new RegExp(re.source, re.flags + 'g');
const preisMuster = /(\d+),(\d{2}) €/i;
const text = 'Brot 2,49 €, Milch 1,19 €, Käse 4,99 €';
const preise = [...text.matchAll(ensureGlobal(preisMuster))]
.map(([, euro, cent]) => Number(`${euro}.${cent}`));
console.log(preise);
console.log(ensureGlobal(preisMuster).flags);
Zwei reguläre Ausdrücke auf Gleichheit prüfen
const sameRegExp = (a, b) => a.source === b.source && a.flags === b.flags;
console.log(sameRegExp(/abc/gi, new RegExp('abc', 'ig')));
console.log(sameRegExp(/abc/g, /abc/gm));
Generischer Aufruf des Getters
const getFlags = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get;
// Funktioniert mit jedem Objekt, das die booleschen Eigenschaften besitzt
console.log(getFlags.call({ global: true, sticky: true, ignoreCase: false }));
console.log(RegExp.prototype.flags === '');
// Wichtig · Fallstricke
- Schreibgeschützt:
flagshat keinen Setter. Eine Zuweisung wiere.flags = 'g'wird im Sloppy Mode stillschweigend ignoriert und löst im Strict Mode (auch in ES-Modulen und Klassen) einenTypeErroraus. Wenn Sie andere Flags brauchen, erzeugen Sie mitnew RegExp(re.source, neueFlags)einen neuen Ausdruck. - Beim Klonen doppelte Flags vermeiden:
new RegExp(re.source, re.flags + 'g')wirft einenSyntaxError, wenngschon gesetzt ist. Prüfen Sie das vorher mitincludes(). Auch die Kombination vonuundvist ungültig. lastIndexwird nicht mitkopiert: Ein Klon übersource/flagsbeginnt immer mitlastIndex = 0. Beig- odery-Ausdrücken ist das oft erwünscht, sollte aber bewusst sein.- Wird der Getter auf einem Nicht-Objekt aufgerufen (z. B.
getFlags.call('abc')), wirft er einenTypeError.RegExp.prototype.flagsselbst ergibt"". - Kompatibilität: Wird von allen modernen Browsern und von Node.js unterstützt (Baseline). Die Flags
d(ES2022) undv(ES2024) erscheinen nur in Umgebungen, die sie kennen. Ältere Engines lehnen sie schon beim Erzeugen des Ausdrucks mit einemSyntaxErrorab.