Unicode-Zeichenklassen-Escape: \p{...}, \P{...}
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2020 browserübergreifend verfügbar.
Ein Unicode-Zeichenklassen-Escape ist eine Art von Zeichenklassen-Escape, das mit einer durch eine Unicode-Eigenschaft festgelegten Menge von Zeichen übereinstimmt. Es wird nur im Unicode-bewussten Modus unterstützt. Wenn das Flag v aktiviert ist, kann es auch mit Zeichenfolgen endlicher Länge übereinstimmen.
Probieren Sie es aus
const sentence = "A ticket to 大阪 costs ¥2000 👌.";
const regexpEmojiPresentation = /\p{Emoji_Presentation}/gu;
console.log(sentence.match(regexpEmojiPresentation));
// Expected output: Array ["👌"]
const regexpNonLatin = /\P{Script_Extensions=Latin}+/gu;
console.log(sentence.match(regexpNonLatin));
// Expected output: Array [" ", " ", " 大阪 ", " ¥2000 👌."]
const regexpCurrencyOrPunctuation = /\p{Sc}|\p{P}/gu;
console.log(sentence.match(regexpCurrencyOrPunctuation));
// Expected output: Array ["¥", "."]
Syntax
\p{loneProperty}
\P{loneProperty}
\p{property=value}
\P{property=value}
Parameter
loneProperty-
Ein einzelner Unicode-Eigenschaftsname oder -wert mit derselben Syntax wie
value. Er gibt einen Wert für die EigenschaftGeneral_Categoryoder einen binären Eigenschaftsnamen an. Im Modusvkann es sich auch um eine binäre Unicode-Eigenschaft von Zeichenfolgen handeln.Hinweis: Die ICU-Syntax erlaubt es auch, den Eigenschaftsnamen
Scriptwegzulassen. JavaScript unterstützt dies jedoch nicht, daScript_Extensionsmeist nützlicher ist alsScript. property-
Ein Unicode-Eigenschaftsname. Er darf nur aus ASCII-Buchstaben (
A–Z,a–z) und Unterstrichen (_) bestehen und muss einer der nichtbinären Eigenschaftsnamen sein. value-
Ein Unicode-Eigenschaftswert. Er darf nur aus ASCII-Buchstaben (
A–Z,a–z), Unterstrichen (_) und Ziffern (0–9) bestehen und muss einer der inPropertyValueAliases.txtaufgeführten unterstützten Werte sein.
Beschreibung
\p und \P werden nur im Unicode-bewussten Modus unterstützt. Im nicht Unicode-bewussten Modus sind sie Identity-Escapes für das Zeichen p beziehungsweise P.
Jedes Unicode-Zeichen besitzt eine Reihe von Eigenschaften, die es beschreiben. Beispielsweise hat das Zeichen a für die Eigenschaft General_Category den Wert Lowercase_Letter und für die Eigenschaft Script den Wert Latn. Mit den Escape-Sequenzen \p und \P können Sie Zeichen anhand ihrer Eigenschaften abgleichen. Beispielsweise stimmt a sowohl mit \p{Lowercase_Letter} (der Eigenschaftsname General_Category ist optional) als auch mit \p{Script=Latn} überein. \P erzeugt eine Komplementklasse, die aus Codepunkten ohne die angegebene Eigenschaft besteht.
Wenn das Flag i gesetzt ist, werden \P-Zeichenklassen in den Modi u und v leicht unterschiedlich behandelt. Im Modus u erfolgt das Case-Folding nach der Subtraktion, im Modus v davor. Genauer gesagt stimmt \P{property} im Modus u mit caseFold(allCharacters - charactersWithProperty) überein. Daher stimmt /\P{Lowercase_Letter}/iu weiterhin mit "a" überein, weil A kein Lowercase_Letter ist. Im Modus v stimmt \P{property} dagegen mit caseFold(allCharacters) - caseFold(charactersWithProperty) überein. Daher stimmt /\P{Lowercase_Letter}/iv nicht mit "a" überein, weil A nicht einmal zur Menge aller Zeichen nach dem Case-Folding gehört. Siehe auch Komplementklassen und Abgleich ohne Beachtung der Groß- und Kleinschreibung.
Um mehrere Eigenschaften zu kombinieren, verwenden Sie die mit dem Flag v verfügbare Syntax für die Schnittmenge von Zeichenmengen oder lesen Sie den Abschnitt Subtraktion und Schnittmenge von Mustern.
Im Modus v kann \p mit einer Folge von Codepunkten übereinstimmen, die in Unicode als „Eigenschaften von Zeichenfolgen“ definiert sind. Das ist besonders bei Emojis nützlich, die häufig aus mehreren Codepunkten bestehen. \P kann jedoch nur das Komplement von Zeicheneigenschaften bilden.
Hinweis:
Es gibt Pläne, die Unterstützung für Eigenschaften von Zeichenfolgen auch auf den Modus u zu übertragen.
Beispiele
>Allgemeine Kategorien
Allgemeine Kategorien dienen dazu, Unicode-Zeichen zu klassifizieren. Unterkategorien ermöglichen eine genauere Einordnung. In Unicode-Eigenschafts-Escapes können sowohl Kurz- als auch Langformen verwendet werden.
Damit lassen sich Buchstaben, Zahlen, Symbole, Satzzeichen, Leerzeichen usw. abgleichen. Eine ausführlichere Liste der allgemeinen Kategorien finden Sie in der Unicode-Spezifikation.
// finding all the letters of a text
const story = "It's the Cheshire Cat: now I shall have somebody to talk to.";
// Most explicit form
story.match(/\p{General_Category=Letter}/gu);
// It is not mandatory to use the property name for General categories
story.match(/\p{Letter}/gu);
// This is equivalent (short alias):
story.match(/\p{L}/gu);
// This is also equivalent (disjunction of all the subcategories using short aliases)
story.match(/\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}/gu);
Schriftsysteme und Erweiterungen von Schriftsystemen
Manche Sprachen verwenden unterschiedliche Schriftsysteme. Englisch und Spanisch werden beispielsweise in lateinischer Schrift geschrieben, während Arabisch und Russisch andere Schriftsysteme verwenden (arabische beziehungsweise kyrillische Schrift). Mit den Unicode-Eigenschaften Script und Script_Extensions können reguläre Ausdrücke Zeichen anhand des Schriftsystems abgleichen, in dem sie hauptsächlich verwendet werden (Script), beziehungsweise anhand aller Schriftsysteme, denen sie angehören (Script_Extensions).
Beispielsweise gehört A zum Schriftsystem Latin und ε zum Schriftsystem Greek.
const mixedCharacters = "aεЛ";
// Using the canonical "long" name of the script
mixedCharacters.match(/\p{Script=Latin}/u); // a
// Using a short alias (ISO 15924 code) for the script
mixedCharacters.match(/\p{Script=Grek}/u); // ε
// Using the short name sc for the Script property
mixedCharacters.match(/\p{sc=Cyrillic}/u); // Л
Weitere Einzelheiten finden Sie in der Unicode-Spezifikation, der Tabelle der Schriftsysteme in der ECMAScript-Spezifikation und der ISO-15924-Liste der Schriftsystem-Codes.
Wenn ein Zeichen in einer begrenzten Anzahl von Schriftsystemen verwendet wird, stimmt die Eigenschaft Script nur mit dem „vorherrschenden“ Schriftsystem überein. Um Zeichen anhand eines „nicht vorherrschenden“ Schriftsystems abzugleichen, können Sie die Eigenschaft Script_Extensions verwenden (kurz scx).
// ٢ is the digit 2 in Arabic-Indic notation
// while it is predominantly written within the Arabic script
// it can also be written in the Thaana script
"٢".match(/\p{Script=Thaana}/u);
// null as Thaana is not the predominant script
"٢".match(/\p{Script_Extensions=Thaana}/u);
// ["٢", index: 0, input: "٢", groups: undefined]
Unicode-Eigenschafts-Escapes im Vergleich zu Zeichenklassen
In regulären JavaScript-Ausdrücken können Sie auch Zeichenklassen und insbesondere \w oder \d verwenden, um Buchstaben oder Ziffern abzugleichen. Diese Formen stimmen jedoch nur mit Zeichen aus dem lateinischen Schriftsystem überein (genauer gesagt mit ASCII-Buchstaben, Ziffern und dem Unterstrich bei \w sowie mit ASCII-Ziffern bei \d). Wie dieses Beispiel zeigt, können Zeichenklassen bei nichtlateinischem Text umständlich sein.
Kategorien von Unicode-Eigenschafts-Escapes decken wesentlich mehr Zeichen ab. \p{Letter} und \p{Number} funktionieren mit jedem Schriftsystem.
// Trying to use ranges to avoid \w limitations:
const nonEnglishText = "Приключения Алисы в Стране чудес";
const regexpBMPWord = /([\u0000-\u001F\u0021-\uFFFF])+/gu;
// BMP goes through U+0000 to U+FFFF but space is U+0020
console.table(nonEnglishText.match(regexpBMPWord));
// Using Unicode property escapes instead
const regexpUPE = /\p{L}+/gu;
console.table(nonEnglishText.match(regexpUPE));
Preise abgleichen
Das folgende Beispiel gleicht Preise in einer Zeichenfolge ab:
function getPrices(str) {
// Sc stands for "currency symbol"
return [...str.matchAll(/\p{Sc}\s*[\d.,]+/gu)].map((match) => match[0]);
}
const str = `California rolls $6.99
Crunchy rolls $8.49
Shrimp tempura $10.99`;
console.log(getPrices(str)); // ["$6.99", "$8.49", "$10.99"]
const str2 = `US store $19.99
Europe store €18.99
Japan store ¥2000`;
console.log(getPrices(str2)); // ["$19.99", "€18.99", "¥2000"]
Zeichenfolgen abgleichen
Mit dem Flag v kann \p{…} mithilfe einer Eigenschaft von Zeichenfolgen auch Zeichenfolgen abgleichen, die länger als ein Zeichen sein können:
const flag = "🇺🇳";
console.log(flag.length); // 4 (two code points, each a surrogate pair)
console.log([...flag].length); // 2
console.log(/\p{RGI_Emoji_Flag_Sequence}/v.exec(flag)); // [ '🇺🇳' ]
Mit \P können Sie dagegen keine „Zeichenfolge ohne eine bestimmte Eigenschaft“ abgleichen, da unklar ist, wie viele Zeichen dabei erfasst werden sollen.
/\P{RGI_Emoji_Flag_Sequence}/v; // SyntaxError: Invalid regular expression: Invalid property name
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # prod-CharacterClassEscape> |
Browser-Kompatibilität
Siehe auch
- Leitfaden zu Zeichenklassen
- Reguläre Ausdrücke
- Zeichenklasse:
[...],[^...] - Zeichenklassen-Escape:
\d,\D,\w,\W,\s,\S - Zeichen-Escape:
\n,\u{...} - Alternative:
| - Unicode-Zeicheneigenschaft auf Wikipedia
- ES2018: RegExp Unicode property escapes von Dr. Axel Rauschmayer (2017)
- Reguläre Unicode-Ausdrücke § Eigenschaften
- Unicode Utilities: UnicodeSet
- RegExp-v-Flag mit Mengennotation und Eigenschaften von Zeichenfolgen auf v8.dev (2022)