Signatur
Beschreibung
Der Punkt ist der Platzhalter (englisch „Wildcard“) in regulären Ausdrücken. Er passt auf genau ein Zeichen, egal welches, mit einer Ausnahme: Zeilenendzeichen. Dazu zählen \n (Zeilenvorschub), \r (Wagenrücklauf), \u2028 (Zeilentrenner) und \u2029 (Absatztrenner).
Man verwendet den Punkt, wenn an einer Stelle irgendein Zeichen stehen darf, zum Beispiel in /h.t/, das auf „hat“, „hut“ oder „h9t“ passt. Zusammen mit Quantoren wie .* (null oder mehr beliebige Zeichen) oder .+ (mindestens eines) entstehen sehr flexible Muster. .* ist allerdings gierig, nimmt also so viel wie möglich. Die genügsame Variante .*? hört dagegen beim ersten möglichen Ende auf.
Zwei Flags ändern, wie der Punkt arbeitet:
s(dotAll, ES2018): Der Punkt passt dann auch auf Zeilenendzeichen, also auf wirklich jedes Zeichen.ubzw.v(Unicode): Der Punkt passt auf einen ganzen Unicode-Codepunkt statt auf eine einzelne UTF-16-Codeeinheit. So werden auch Emojis und andere Zeichen außerhalb der BMP (Basic Multilingual Plane) als ein einziges Zeichen erkannt.
Innerhalb einer Zeichenklasse ([.]) und maskiert als \. steht der Punkt einfach für das Zeichen „.“ selbst.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $s (Flag) | RegExp-Flag | nicht gesetzt | Aktiviert den dotAll-Modus: . passt dann auch auf \n, \r, \u2028 und \u2029. Abfragbar über regex.dotAll. |
| $u / v (Flag) | RegExp-Flag | nicht gesetzt | Unicode-Modus: . passt auf einen vollständigen Codepunkt, also auch auf ein Surrogatpaar wie 😀, statt auf eine halbe UTF-16-Einheit. |
Rückgabewert
test(), exec() oder match().Beispiele
Grundlagen: ein beliebiges Zeichen vor „y“
const text = 'yes make my day';
// Beliebiges Zeichen, direkt gefolgt von "y"
console.log(text.match(/.y/g));
// "h" + ein beliebiges Zeichen + "t"
const woerter = ['hat', 'hut', 'h9t', 'ht', 'heat'];
console.log(woerter.filter((w) => /^h.t$/.test(w)));
Mehrzeiligen Text mit dem dotAll-Flag s durchsuchen
const html = `<!-- Kommentar
über zwei Zeilen -->`;
// Ohne s: Der Punkt passt nicht auf \n
console.log(/<!--.*-->/.test(html));
// Mit s: Der Punkt passt auch auf Zeilenumbrüche
console.log(/<!--.*-->/s.test(html));
console.log(/<!--.*-->/s.dotAll);
Emojis und Surrogatpaare: Flag u
const emoji = '😀';
console.log(emoji.length); // 2 UTF-16-Einheiten
console.log(/^.$/.test(emoji)); // Punkt = eine Codeeinheit
console.log(/^.$/u.test(emoji)); // Punkt = ein Codepunkt
// Zeichen korrekt zählen
console.log('Hi😀'.match(/./gu).length);
Fallstrick: Punkt als Literal maskieren, gierig vs. genügsam
// Fehler: Der unmaskierte Punkt passt auf jedes Zeichen
console.log(/^example.com$/.test('exampleXcom')); // ungewollt true
console.log(/^example\.com$/.test('exampleXcom')); // korrekt false
// Gierig (.*) vs. genügsam (.*?)
const s = '<b>eins</b> und <b>zwei</b>';
console.log(s.match(/<b>.*<\/b>/)[0]);
console.log(s.match(/<b>.*?<\/b>/g));
// Wichtig · Fallstricke
- Zeilenendzeichen: Ohne das Flag
spasst.nicht auf\n,\r,\u2028und\u2029. Vor ES2018 schrieb man dafür[\s\S]oder[^]. Beides funktioniert weiterhin in allen Umgebungen. - Nicht mit dem Flag
mverwechseln:m(multiline) ändert nur, wie^und$arbeiten, nicht den Punkt. - Literaler Punkt: Für ein echtes „.“, etwa in Domains, Dateiendungen oder IP-Adressen, muss man
\.schreiben oder[.]verwenden. ImRegExp-Konstruktor mit String braucht man einen doppelten Backslash:new RegExp('\\.js$'). - Unicode: Ohne
u/vzerlegt der Punkt Emojis und andere Zeichen außerhalb der BMP in zwei Hälften. Zusammengesetzte Grapheme wie 👨👩👧 oder Buchstaben mit kombinierten Akzenten bestehen aber auch mituaus mehreren Codepunkten. Für echte Zeichen, wie Nutzer sie sehen, eignet sichIntl.Segmenter. - Performance: Gierige Muster wie
.*, besonders verschachtelt wie(.*)*, können katastrophales Backtracking auslösen. Das ist ein ReDoS-Risiko bei Eingaben von Nutzern. Besser sind genauere Zeichenklassen wie[^<]*oder genügsame Quantoren. - Kompatibilität: Der Punkt selbst funktioniert überall. Das Flag
sgibt es seit ES2018 in allen modernen Browsern und seit Node.js 8.10, nicht aber im Internet Explorer. Das Flagvgibt es seit ES2024.