Start · Sprachen · JavaScript · Referenz · Wildcard: .

Wildcard: .

Keyword

Der Punkt <code>.</code> in einem regulären Ausdruck passt auf genau ein beliebiges Zeichen, außer auf Zeilenendzeichen.

seit JavaScript ES1 (dotAll-Flag s: ES2018, Unicode-Flag u: ES2015 Kategorie: syntax

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.
  • u bzw. 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

Typ
Musterbaustein (kein eigener Wert)
Beschreibung
Der Punkt gibt selbst nichts zurück. Er passt im Suchmuster auf genau ein Zeichen. Das Ergebnis liefern die aufrufenden Methoden wie 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)));
[ 'my', 'ay' ] [ 'hat', 'hut', 'h9t' ]

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);
false true true

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);
2 false true 3

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));
true false <b>eins</b> und <b>zwei</b> [ '<b>eins</b>', '<b>zwei</b>' ]

// Wichtig · Fallstricke

  • Zeilenendzeichen: Ohne das Flag s passt . nicht auf \n, \r, \u2028 und \u2029. Vor ES2018 schrieb man dafür [\s\S] oder [^]. Beides funktioniert weiterhin in allen Umgebungen.
  • Nicht mit dem Flag m verwechseln: 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. Im RegExp-Konstruktor mit String braucht man einen doppelten Backslash: new RegExp('\\.js$').
  • Unicode: Ohne u/v zerlegt 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 mit u aus mehreren Codepunkten. Für echte Zeichen, wie Nutzer sie sehen, eignet sich Intl.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 s gibt es seit ES2018 in allen modernen Browsern und seit Node.js 8.10, nicht aber im Internet Explorer. Das Flag v gibt es seit ES2024.