Signatur
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].\Dentspricht[^0-9].\w: ein ASCII-Wortzeichen, entspricht[A-Za-z0-9_].\Wentspricht[^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\u2028und\u2029.\Spasst 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
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);
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);
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));
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);
// Wichtig · Fallstricke
- ASCII-Beschränkung:
\wund\dpassen 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 Flaguoderv. - Wortgrenze
\b:\bist über\wdefiniert und daher ebenfalls nur ASCII-basiert./\bber\b/.test('über')ergibttrue, weil „ü“ nicht als Wortzeichen gilt. - Sonderfall
u+i: Sind beide Flags gesetzt, passt\wzusätzlich aufſ(U+017F) undK(Kelvin-Zeichen, U+212A). Der Grund ist die Unicode-Faltung von Groß- und Kleinschreibung. \sist 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 Flags(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 Zeichend. - Kompatibilität: Alle sechs Escapes funktionieren in jedem Browser und in jeder Node.js-Version. Die Zeichenmenge von
\skann sich je nach unterstützter Unicode-Version der Engine geringfügig unterscheiden.