Signatur
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
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);
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]));
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));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
re.multiline = truehat keine Wirkung (im Strict Mode gibt es einenTypeError). Flags lassen sich nur über ein neuesRegExpändern. - Nicht mit
dotAllverwechseln:mändert nur^und$, nicht den Punkt.. Für Punkt-passt-auf-Zeilenumbruch brauchst du dass-Flag. - Windows-Zeilenenden: Bei
\r\nsteht$vor dem\r. Ein Muster wie/^x$/mpasst dann auf'x\r\n', aber.bis zum Zeilenende nimmt das\rnicht mit. Normalisiere Zeilenenden bei Bedarf vorher. - Auf
RegExp.prototypeselbst liefert der Getterundefined. Bei anderen Objekten, die keine RegExp sind, wirft er einenTypeError. - Die veraltete statische Eigenschaft
RegExp.multilinebzw.RegExp.$*aus alten Firefox-Versionen ist entfernt und nicht dasselbe. - Kompatibilität: wird von allen Browsern und von Node.js unterstützt.