Signatur
Beschreibung
Ein Unicode-Zeichenklassen-Escape beschreibt in einem regulären Ausdruck eine Menge von Zeichen über eine Unicode-Eigenschaft statt über eine feste Liste. \p{...} trifft jedes Zeichen, das die Eigenschaft besitzt. Das großgeschriebene \P{...} ist die Umkehrung und trifft jedes Zeichen, das sie nicht besitzt. So lassen sich etwa „alle Buchstaben aller Schriften“, „alle Dezimalziffern“ oder „alle griechischen Zeichen“ ausdrücken, ohne Codepunkt-Bereiche von Hand zu pflegen.
Es gibt drei Schreibweisen:
- Allgemeine Kategorie (General_Category):
\p{L},\p{Lu},\p{Nd}, ausgeschrieben auch\p{General_Category=Letter}oder\p{gc=L}. - Schrift:
\p{Script=Greek}bzw.\p{sc=Grek}oder\p{Script_Extensions=Latin}bzw.\p{scx=Latn}. - Binäre Eigenschaften:
\p{Alphabetic},\p{White_Space},\p{Emoji},\p{ASCII},\p{Any}und weitere.
Die Escapes funktionieren nur mit dem Flag u oder v. Ohne diese Flags ist \p ein überflüssiges Escape und steht einfach für den Buchstaben p. Mit dem Flag v (ES2024) gibt es zusätzlich Eigenschaften von Zeichenketten wie \p{RGI_Emoji}. Sie treffen auch Folgen aus mehreren Codepunkten, etwa Emoji mit Hautfarbe oder Flaggen. Außerdem lassen sich Mengenoperationen wie [\p{L}--\p{ASCII}] verwenden.
Typische Einsatzfälle sind die Prüfung von Eingaben in mehreren Sprachen (Namen, Benutzernamen), das Erzeugen von URL-Slugs, das Filtern oder Zählen von Emoji und das Entfernen von diakritischen Zeichen nach String.prototype.normalize().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $Eigenschaft Pflicht | Bezeichner (Unicode-Eigenschaftsname) | Name der Eigenschaft oder, in der Kurzform, ein Wert der allgemeinen Kategorie. Beispiele: L, Letter, Nd, Alphabetic, Emoji, White_Space. Groß- und Kleinschreibung werden unterschieden. |
|
| $Wert | Bezeichner (Eigenschaftswert) | Nur in der Form Name=Wert, und nur für die Namen General_Category/gc, Script/sc und Script_Extensions/scx. Beispiel: \p{sc=Cyrillic}. |
|
| $Flag u / v Pflicht | RegExp-Flag | Der reguläre Ausdruck muss mit u oder v erstellt werden. Eigenschaften von Zeichenketten (z. B. RGI_Emoji) gibt es nur mit v. |
Rückgabewert
\P ohne sie. Mit dem Flag v kann es bei Eigenschaften von Zeichenketten auch eine Folge aus mehreren Codepunkten treffen.Beispiele
Einfacher Fall: Buchstaben aller Schriften erkennen
const nurBuchstaben = /^\p{L}+$/u;
console.log(nurBuchstaben.test('Müller')); // Umlaut
console.log(nurBuchstaben.test('Ελλάδα')); // Griechisch
console.log(nurBuchstaben.test('東京')); // CJK
console.log(nurBuchstaben.test('R2D2')); // Ziffern sind keine Buchstaben
// Zum Vergleich: \w kennt nur ASCII
console.log(/^\w+$/u.test('Müller'));
Praxis: Namensfeld validieren und URL-Slug erzeugen
// Namen: Buchstaben, kombinierende Zeichen, Leerzeichen, Bindestrich, Apostroph
const istGueltigerName = (name) => /^[\p{L}\p{M}' -]+$/u.test(name.trim());
console.log(istGueltigerName('Zoë O\'Brien-Łukasz'));
console.log(istGueltigerName('<script>'));
const slugify = (text) =>
text
.normalize('NFD') // é → e + ◌́
.replace(/\p{M}/gu, '') // diakritische Zeichen entfernen
.toLowerCase()
.replace(/[^\p{L}\p{N}]+/gu, '-') // alles andere zu Bindestrichen
.replace(/^-+|-+$/g, '');
console.log(slugify('Crème brûlée – Rezept für 4 Personen!'));
Schrift-Eigenschaft und Negation mit \P
const text = 'Hello Привет Γειά 123';
// Nur kyrillische Wörter herausziehen
console.log(text.match(/\p{Script=Cyrillic}+/gu));
// Alles entfernen, was kein Buchstabe ist
console.log(text.replace(/\P{L}/gu, ''));
// Griechisch per Kurzform sc=Grek
console.log(/\p{sc=Grek}/u.test(text));
Emoji mit Flag v (ES2024) zählen
const nachricht = 'Top 👍🏽 Team 👨👩👧 aus 🇩🇪!';
// \p{Emoji} würde auch Ziffern wie 1 oder # treffen; RGI_Emoji erfasst ganze Emoji-Folgen
const emojis = nachricht.match(/\p{RGI_Emoji}/gv);
console.log(emojis);
console.log(emojis.length);
// Mengen-Differenz: Nicht-ASCII-Buchstaben
console.log('Straße café'.match(/[\p{L}--\p{ASCII}]/gv));