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

RegExp.prototype.multiline

Eigenschaft

Die Accessor-Eigenschaft <code>multiline</code> gibt <code>true</code> zurück, wenn der reguläre Ausdruck mit dem <code>m</code>-Flag (Mehrzeilenmodus) erzeugt wurde.

seit JavaScript ES3 (als Accessor-Eigenschaft seit ES2015) – Basel Kategorie: method-property

Signatur

get RegExp.prototype.multiline

Beschreibung

RegExp.prototype.multiline ist eine schreibgeschützte Getter-Eigenschaft. Sie liefert true, wenn das m-Flag gesetzt ist, sonst false. Das Flag ändert die Bedeutung der Anker ^ und $: Ohne m passen sie nur auf Anfang und Ende der gesamten Eingabe, mit m zusätzlich auf Anfang und Ende jeder Zeile, also direkt nach bzw. vor einem Zeilenumbruch (\n, \r, \u2028, \u2029).

Nützlich ist die Eigenschaft vor allem dann, wenn du fremde oder dynamisch erzeugte RegExp-Objekte prüfen willst, etwa in Hilfsfunktionen, die Muster entgegennehmen und je nach Flag anders arbeiten. Oft ist es sinnvoll, ein vorhandenes Muster mit ergänztem m-Flag neu zu erzeugen, statt ein neues Muster zu schreiben.

Wichtig: Das m-Flag hat keinen Einfluss auf den Punkt .. Der Punkt passt weiterhin auf keinen Zeilenumbruch. Dafür brauchst du das s-Flag (dotAll).

Rückgabewert

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

Beispiele

Flag abfragen

const mitM = /^foo/m;
const ohneM = new RegExp('^foo');

console.log(mitM.multiline);
console.log(ohneM.multiline);
console.log(mitM.flags);
true false m

Unterschied bei ^ und $ im mehrzeiligen Text

const text = 'Titel: A\nTitel: B\nTitel: C';

const einzeilig = /^Titel: (\w)$/g;
const mehrzeilig = /^Titel: (\w)$/gm;

console.log([...text.matchAll(einzeilig)].map((m) => m[1]));
console.log([...text.matchAll(mehrzeilig)].map((m) => m[1]));
[] [ 'A', 'B', 'C' ]

Muster bei Bedarf in den Mehrzeilenmodus bringen

const ensureMultiline = (re) =>
  re.multiline ? re : new RegExp(re.source, re.flags + 'm');

const kommentar = /^#.*$/g;
const log = '# Start\nwert=1\n# Ende';

const re = ensureMultiline(kommentar);
console.log(re.multiline, re.flags);
console.log(log.match(re));
true gm [ '# Start', '# Ende' ]

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie re.multiline = true hat keine Wirkung (im Strict Mode gibt es einen TypeError). Flags lassen sich nur über ein neues RegExp ändern.
  • Nicht mit dotAll verwechseln: m ändert nur ^ und $, nicht den Punkt .. Für Punkt-passt-auf-Zeilenumbruch brauchst du das s-Flag.
  • Windows-Zeilenenden: Bei \r\n steht $ vor dem \r. Ein Muster wie /^x$/m passt dann auf 'x\r\n', aber . bis zum Zeilenende nimmt das \r nicht mit. Normalisiere Zeilenenden bei Bedarf vorher.
  • Auf RegExp.prototype selbst liefert der Getter undefined. Bei anderen Objekten, die keine RegExp sind, wirft er einen TypeError.
  • Die veraltete statische Eigenschaft RegExp.multiline bzw. RegExp.$* aus alten Firefox-Versionen ist entfernt und nicht dasselbe.
  • Kompatibilität: wird von allen Browsern und von Node.js unterstützt.