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

RegExp.prototype.flags

Eigenschaft

Gibt alle gesetzten Flags eines regulären Ausdrucks als String zurück, z. B. <code>"gi"</code>, immer in fester Reihenfolge.

seit JavaScript ES2015 Kategorie: method-property

Signatur

get RegExp.prototype.flags

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

Typ
string
Beschreibung
Ein String mit den gesetzten Flags in der Reihenfolge 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 === '');
gi gmsy true

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);
[ 2.49, 1.19, 4.99 ] gi

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));
true false

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 === '');
gy true

// Wichtig · Fallstricke

  • Schreibgeschützt: flags hat keinen Setter. Eine Zuweisung wie re.flags = 'g' wird im Sloppy Mode stillschweigend ignoriert und löst im Strict Mode (auch in ES-Modulen und Klassen) einen TypeError aus. Wenn Sie andere Flags brauchen, erzeugen Sie mit new RegExp(re.source, neueFlags) einen neuen Ausdruck.
  • Beim Klonen doppelte Flags vermeiden: new RegExp(re.source, re.flags + 'g') wirft einen SyntaxError, wenn g schon gesetzt ist. Prüfen Sie das vorher mit includes(). Auch die Kombination von u und v ist ungültig.
  • lastIndex wird nicht mitkopiert: Ein Klon über source/flags beginnt immer mit lastIndex = 0. Bei g- oder y-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 einen TypeError. RegExp.prototype.flags selbst ergibt "".
  • Kompatibilität: Wird von allen modernen Browsern und von Node.js unterstützt (Baseline). Die Flags d (ES2022) und v (ES2024) erscheinen nur in Umgebungen, die sie kennen. Ältere Engines lehnen sie schon beim Erzeugen des Ausdrucks mit einem SyntaxError ab.