Start · Sprachen · JavaScript · Referenz · Modifier: (?ims-ims:...)

Modifier: (?ims-ims:...)

Keyword

Ein Modifier schaltet die Flags <code>i</code>, <code>m</code> und <code>s</code> nur für einen Teil eines regulären Ausdrucks ein oder aus.

seit JavaScript ES2025 – Chrome/Edge 125+, Firefox 132+, Node.js 2 Kategorie: syntax

Signatur

(?flags:muster) | (?-flags:muster) | (?flags-flags:muster)

Beschreibung

Mit einem Modifier (auch „Pattern Modifier“ oder „Inline-Flags“) gelten die Flags eines regulären Ausdrucks nicht mehr zwingend für das ganze Muster. Die Schreibweise (?i:…) schaltet ein Flag nur innerhalb der Gruppe ein, (?-i:…) schaltet es dort aus. Beides lässt sich kombinieren, etwa (?i-s:…). Außerhalb der Gruppe gelten weiter die Flags des gesamten Ausdrucks, zum Beispiel /…/i.

Erlaubt sind nur drei Flags:

  • i – Groß- und Kleinschreibung ignorieren
  • m – mehrzeilig: ^ und $ passen an Zeilengrenzen
  • s – dotAll: . passt auch auf Zeilenumbrüche

Die Flags g, y, d, u und v betreffen den ganzen Ausdruck oder dessen Auswertung. Sie lassen sich deshalb nicht per Modifier ändern.

Wie (?:…) ist eine Modifier-Gruppe eine nicht-erfassende Gruppe: Sie erzeugt keinen Eintrag im Treffer-Array. Das ist praktisch, wenn man Muster aus mehreren Quellen zusammensetzt, von denen nur einige z. B. ohne Beachtung der Groß- und Kleinschreibung prüfen sollen. Früher musste man sich mit Umwegen wie [Hh][Ee][Ll][Ll][Oo] behelfen.

Parameter

Name Typ Default Beschreibung
$flags (vor dem Minus) string (Kombination aus i, m, s) Flags, die innerhalb der Gruppe eingeschaltet werden, z. B. i in (?i:…).
$-flags (nach dem Minus) string (Kombination aus i, m, s) Flags, die innerhalb der Gruppe ausgeschaltet werden, z. B. -i in (?-i:…). Vor oder nach dem Minus muss mindestens ein Flag stehen.
$muster Pflicht RegExp-Teilmuster Das Teilmuster, für das die geänderten Flags gelten. Es darf weitere Gruppen enthalten, auch verschachtelte Modifier.

Rückgabewert

Typ
— (Syntaxelement)
Beschreibung
Keine eigenständige Rückgabe. Die Gruppe passt auf denselben Text wie muster unter den geänderten Flags und legt keine Erfassungsgruppe an.

Beispiele

Nur ein Wort ohne Beachtung der Groß- und Kleinschreibung

const re = /(?i:hallo) Welt/;

console.log(re.test('HALLO Welt')); // i gilt nur für "hallo"
console.log(re.test('hallo welt')); // "Welt" wird exakt geprüft
true false

Flag für einen Teil ausschalten

// Der Header-Name ist egal geschrieben, der Wert muss exakt "JSON" lauten
const re = /^content-type: (?-i:JSON)$/i;

console.log(re.test('Content-Type: JSON'));
console.log(re.test('CONTENT-TYPE: json'));
true false

dotAll nur für einen Block (s-Flag)

const text = `BEGIN
Zeile 1
Zeile 2
END`;

// Nur innerhalb der Gruppe passt der Punkt auch auf Zeilenumbrüche
const re = /BEGIN(?s:(.*))END/;
const [, inhalt] = text.match(re);
console.log(JSON.stringify(inhalt));
"\nZeile 1\nZeile 2\n"

Unterstützung prüfen

const unterstuetztModifier = (() => {
  try {
    new RegExp('(?i:a)');
    return true;
  } catch {
    return false; // ältere Engines werfen einen SyntaxError
  }
})();

const re = unterstuetztModifier
  ? new RegExp('(?i:id)-[0-9]+')
  : /[iI][dD]-[0-9]+/;

console.log(re.test('ID-42'));
true

// Wichtig · Fallstricke

  • Kompatibilität: Modifier sind neu (ES2025). Ältere Browser und Node.js-Versionen melden einen SyntaxError, und zwar schon beim Parsen eines Regex-Literals. Das Skript läuft dann gar nicht erst. Wenn ältere Umgebungen wichtig sind, baue den Ausdruck mit new RegExp() und prüfe die Unterstützung vorher, wie im Beispiel oben.
  • Nur i, m, s: Etwa (?g:…) oder (?u:…) ist ein Syntaxfehler.
  • Diese Formen sind ungültig: (?-:…) ohne Flag, ein doppeltes Flag wie (?ii:…) und dasselbe Flag auf beiden Seiten wie (?i-i:…).
  • Keine Erfassungsgruppe: Wenn du den Treffer brauchst, lege eine eigene Gruppe hinein, z. B. (?i:(abc)) oder (?i:(?<name>abc)).
  • Nur innerhalb der Gruppe: Anders als in manchen anderen Regex-Varianten, z. B. PCRE mit (?i), gibt es in JavaScript keine Inline-Flags, die bis zum Ende des Musters gelten. Die Doppelpunkt-Form mit Klammern ist Pflicht.
  • RegExp.prototype.flags und ignoreCase usw. zeigen nur die Flags des gesamten Ausdrucks, nicht die der Modifier.