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

RegExp.prototype.dotAll

Eigenschaft

Gibt zurück, ob ein regulärer Ausdruck mit dem <code>s</code>-Flag (dotAll) erstellt wurde, sodass <code>.</code> auch Zeilenumbrüche erfasst.

seit JavaScript ES2018 Kategorie: method-property

Signatur

get RegExp.prototype.dotAll

Beschreibung

Die Accessor-Eigenschaft dotAll von RegExp-Instanzen liefert true, wenn der reguläre Ausdruck mit dem Flag s erzeugt wurde, andernfalls false. Sie ist rein lesend: Es gibt nur einen Getter, keinen Setter.

Ohne s-Flag passt der Punkt . auf jedes Zeichen außer Zeilenendezeichen: \n (LF), \r (CR), \u2028 (Zeilentrenner) und \u2029 (Absatztrenner). Mit s erfasst . auch diese Zeichen. Das ist praktisch, wenn man mehrzeilige Blöcke wie Kommentare, HTML-Fragmente oder Log-Einträge am Stück erfassen will.

Man nutzt dotAll vor allem, um übergebene reguläre Ausdrücke zu prüfen, etwa in Bibliotheken, die Muster von außen erhalten und sich je nach Flag anders verhalten sollen. Alternativ zeigt die Eigenschaft flags alle Flags auf einmal als Zeichenkette.

Rückgabewert

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

Beispiele

Flag abfragen

const mitS = /foo.bar/s;
const ohneS = /foo.bar/;

console.log(mitS.dotAll);
console.log(ohneS.dotAll);
console.log(new RegExp('a.b', 'gs').dotAll);
true false true

Unterschied beim Erfassen mehrzeiliger Texte

const text = 'Start\nMitte\nEnde';

console.log(/Start.*Ende/.test(text));
console.log(/Start.*Ende/s.test(text));
false true

Mehrzeilige Blockkommentare extrahieren

const code = `const a = 1;
/* Erste Zeile
   zweite Zeile */
const b = 2;`;

const kommentarRegex = /\/\*(.*?)\*\//gs;
console.log(kommentarRegex.dotAll);

for (const [, inhalt] of code.matchAll(kommentarRegex)) {
  console.log(inhalt.trim());
}
true Erste Zeile zweite Zeile

Übergebenes Muster absichern

const ensureDotAll = (regex) =>
  regex.dotAll ? regex : new RegExp(regex.source, regex.flags + 's');

const r = ensureDotAll(/<div>(.*)<\/div>/i);
console.log(r.flags, r.dotAll);
console.log(r.exec('<div>Zeile 1\nZeile 2</div>')[1]);
is true Zeile 1 Zeile 2

// Wichtig · Fallstricke

  • Nur lesbar: regex.dotAll = true ändert nichts. Im Strict Mode wirft die Zuweisung einen TypeError, weil es keinen Setter gibt. Um das Flag zu setzen, erzeugt man mit new RegExp(regex.source, regex.flags + 's') einen neuen Ausdruck.
  • Nicht mit m verwechseln: Das m-Flag (multiline) ändert nur das Verhalten von ^ und $, nicht das von .. Beide Flags lassen sich kombinieren.
  • Alternative ohne Flag: Vor ES2018 schrieb man dafür [\s\S] oder [^]. Diese Schreibweisen funktionieren weiterhin und laufen auch in sehr alten Umgebungen.
  • Greift man direkt auf RegExp.prototype.dotAll zu, kommt undefined zurück. Bei anderen Objekten als RegExp-Instanzen wirft der Getter einen TypeError.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt (Chrome 62+, Firefox 78+, Safari 11.1+) und von Node.js ab Version 8.10. Im Internet Explorer gibt es das Flag nicht, dort ist /…/s sogar ein Syntaxfehler.
  • Leistung: Gierige Muster wie .* mit s können auf großen Texten sehr viel erfassen und oft zurückspringen (Backtracking). Besser sind genügsame Quantoren wie .*? oder genauere Zeichenklassen.