Signatur
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
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);
Unterschied beim Erfassen mehrzeiliger Texte
const text = 'Start\nMitte\nEnde';
console.log(/Start.*Ende/.test(text));
console.log(/Start.*Ende/s.test(text));
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());
}
Ü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]);
// Wichtig · Fallstricke
- Nur lesbar:
regex.dotAll = trueändert nichts. Im Strict Mode wirft die Zuweisung einenTypeError, weil es keinen Setter gibt. Um das Flag zu setzen, erzeugt man mitnew RegExp(regex.source, regex.flags + 's')einen neuen Ausdruck. - Nicht mit
mverwechseln: Dasm-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.dotAllzu, kommtundefinedzurück. Bei anderen Objekten als RegExp-Instanzen wirft der Getter einenTypeError. - 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
/…/ssogar ein Syntaxfehler. - Leistung: Gierige Muster wie
.*mitskönnen auf großen Texten sehr viel erfassen und oft zurückspringen (Backtracking). Besser sind genügsame Quantoren wie.*?oder genauere Zeichenklassen.