Start · Sprachen · JavaScript · Referenz · Zeichenklassen-Escape: \\d, \\D, \\w, \\W, \\s, \\S

Zeichenklassen-Escape: \\d, \\D, \\w, \\W, \\s, \\S

Keyword

Zeichenklassen-Escapes wie <code>\d</code>, <code>\w</code> und <code>\s</code> stehen in regulären Ausdrücken für feste Zeichenmengen (Ziffern, Wortzeichen, Leerraum) oder für deren Komplement.

seit JavaScript ES3 (Baseline: alle Browser) Kategorie: syntax

Signatur

\d, \D, \w, \W, \s, \S

Beschreibung

Ein Zeichenklassen-Escape ist eine Kurzschreibweise in einem regulären Ausdruck. Es passt auf genau ein Zeichen aus einer festen Menge. Die Variante mit Großbuchstaben passt auf das Komplement, also auf jedes Zeichen, das nicht zur Menge gehört:

  • \d: eine ASCII-Ziffer, entspricht [0-9]. \D entspricht [^0-9].
  • \w: ein ASCII-Wortzeichen, entspricht [A-Za-z0-9_]. \W entspricht [^A-Za-z0-9_].
  • \s: ein Leerraumzeichen. Dazu gehören Leerzeichen, \t, \n, \v, \f, \r, \u00A0, \uFEFF, alle Zeichen der Unicode-Kategorie Space_Separator (z. B. \u2003) sowie \u2028 und \u2029. \S passt auf alle anderen Zeichen.

Die Escapes können direkt im Muster stehen oder innerhalb einer Zeichenklasse. So passt [\d.,] auf Ziffern, Punkt und Komma. Kombinationen wie [\s\S] oder [\d\D] passen auf jedes beliebige Zeichen, auch auf Zeilenumbrüche. Vor ES2018 war das der übliche Ersatz für das s-Flag (dotAll).

Wichtig: \d und \w sind in JavaScript immer ASCII-basiert, auch mit den Flags u oder v. Umlaute wie „ä“, das „ß“ oder arabisch-indische Ziffern zählen also nicht dazu. Für Muster, die Unicode berücksichtigen sollen, verwendet man Unicode-Property-Escapes wie \p{L} (Buchstaben) oder \p{Nd} (Dezimalziffern). \s berücksichtigt Unicode dagegen schon immer.

Rückgabewert

Typ
—
Beschreibung
Kein Rückgabewert: Es handelt sich um Syntax innerhalb eines Musters. Jedes Escape passt auf genau ein Zeichen der Eingabe.

Beispiele

Alle Zahlen aus einem Text herausziehen

const text = 'Bestellung 4711 vom 12.03.2024, 3 Artikel';
const zahlen = text.match(/\d+/g).map(Number);
console.log(zahlen);
[4711, 12, 3, 2024, 3]

Telefonnummer normalisieren mit \D

const eingabe = '+49 (0) 30 / 123-456';
// Alles entfernen, was keine Ziffer ist
const nurZiffern = eingabe.replace(/\D/g, '');
console.log(nurZiffern);
49030123456

Leerraum zusammenfassen (auch Tabs, Umbrüche, NBSP)

const roh = '  Hallo\t\n  Welt\u00A0 !  ';
const sauber = roh.replace(/\s+/g, ' ').trim();
console.log(JSON.stringify(sauber));
"Hallo Welt !"

Fallstrick: \w erkennt keine Umlaute

const name = 'Müller';
console.log(/^\w+$/.test(name));        // ASCII-only
console.log(/^\w+$/u.test(name));       // auch mit u-Flag nicht
console.log(/^\p{L}+$/u.test(name));    // Unicode-Buchstaben

// Wörter inkl. Umlauten zählen
const woerter = 'Größe über alles'.match(/[\p{L}\p{N}_]+/gu);
console.log(woerter);
false false true ['Größe', 'über', 'alles']

// Wichtig · Fallstricke

  • ASCII-Beschränkung: \w und \d passen nie auf Umlaute, „ß“, Buchstaben mit Akzent oder Ziffern aus anderen Schriften. Deshalb ist eine Prüfung wie /^\w+$/ für Namen ungeeignet. Nehmen Sie stattdessen \p{L}, \p{Nd} oder \p{Alphabetic} mit dem Flag u oder v.
  • Wortgrenze \b: \b ist über \w definiert und daher ebenfalls nur ASCII-basiert. /\bber\b/.test('über') ergibt true, weil „ü“ nicht als Wortzeichen gilt.
  • Sonderfall u + i: Sind beide Flags gesetzt, passt \w zusätzlich auf ſ (U+017F) und K (Kelvin-Zeichen, U+212A). Der Grund ist die Unicode-Faltung von Groß- und Kleinschreibung.
  • \s ist breiter als gedacht: Es passt auch auf geschützte Leerzeichen (\u00A0), die Byte-Order-Mark (\uFEFF) und Zeilenumbrüche. Ein Muster wie /\s+/ kann deshalb über Zeilengrenzen hinweg greifen. Wenn nur Leerzeichen und Tabs gemeint sind, schreiben Sie [ \t].
  • Statt [\s\S]: In modernem Code ist . mit dem Flag s (ES2018) meist besser lesbar.
  • Escapes in Strings: Mit new RegExp() muss der Backslash im String doppelt stehen: new RegExp('\\d+'). '\d' ergibt als String-Literal nur das Zeichen d.
  • Kompatibilität: Alle sechs Escapes funktionieren in jedem Browser und in jeder Node.js-Version. Die Zeichenmenge von \s kann sich je nach unterstützter Unicode-Version der Engine geringfügig unterscheiden.