Start · Sprachen · JavaScript · Referenz · Unicode-Zeichenklassen-Escape: \\p{...}, \\P{...}

Unicode-Zeichenklassen-Escape: \\p{...}, \\P{...}

Keyword

Findet in regulären Ausdrücken Zeichen anhand einer Unicode-Eigenschaft, z. B. alle Buchstaben mit <code>\p{L}</code>. <code>\P{...}</code> findet alle Zeichen, die diese Eigenschaft nicht haben.

seit JavaScript ES2018 (Flag u); Eigenschaften von Zeichenketten m Kategorie: syntax

Signatur

\p{Eigenschaft} | \p{Eigenschaft=Wert} | \P{Eigenschaft} | \P{Eigenschaft=Wert}

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

Typ
Zeichenklasse (Teil eines RegExp-Musters)
Beschreibung
Kein Laufzeitwert. Das Escape trifft genau ein Zeichen (einen Codepunkt) mit der angegebenen Eigenschaft, bei \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'));
true true true false false

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!'));
true false creme-brulee-rezept-fur-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));
[ 'Привет' ] HelloПриветΓειά true

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));
[ '👍🏽', '👨‍👩‍👧', '🇩🇪' ] 3 [ 'ß', 'é' ]