Unicode-Zeichenklassen-Flucht: \p{...}, \P{...}
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2020.
Ein Unicode-Zeichenklassen-Flucht ist eine Art von Zeichenklassen-Flucht, die eine Menge von Zeichen anhand einer Unicode-Eigenschaft abgleicht. Sie wird nur im Unicode-bewussten Modus unterstützt. Wenn das v
-Flag aktiviert ist, kann sie auch genutzt werden, um endliche Zeichenketten zu vergleichen.
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, der der gleichen Syntax wie
value
folgt. Er gibt den Wert für die EigenschaftGeneral_Category
an oder einen binären Eigenschaftsnamen. Imv
-Modus kann es sich auch um eine binäre Unicode-Eigenschaft von Zeichenketten handeln.Hinweis: Die ICU-Syntax erlaubt es, den Eigenschaftsnamen
Script
ebenfalls wegzulassen, aber JavaScript unterstützt dies nicht, daScript_Extensions
meist nützlicher ist alsScript
. property
-
Ein Unicode-Eigenschaftsname. Muss aus ASCII-Buchstaben (
A–Z
,a–z
) und Unterstrichen (_
) bestehen und muss einer der nicht-binären Eigenschaftsnamen sein. value
-
Ein Unicode-Eigenschaftswert. Muss aus ASCII-Buchstaben (
A–Z
,a–z
), Unterstrichen (_
) und Ziffern (0–9
) bestehen und muss einer der unterstützten Werte sein, die inPropertyValueAliases.txt
aufgeführt sind.
Beschreibung
\p
und \P
werden nur im Unicode-bewussten Modus unterstützt. Im Unicode-unbewussten Modus sind sie Identitätsausdrücke für das Zeichen p
oder P
.
Jedes Unicode-Zeichen hat eine Reihe von Eigenschaften, die es beschreiben. Zum Beispiel hat das Zeichen a
die General_Category
-Eigenschaft mit dem Wert Lowercase_Letter
und die Script
-Eigenschaft mit dem Wert Latn
. Die Escape-Sequenzen \p
und \P
ermöglichen es, ein Zeichen basierend auf seinen Eigenschaften abzugleichen. Zum Beispiel kann a
durch \p{Lowercase_Letter}
(der General_Category
Eigenschaftsname ist optional) sowie \p{Script=Latn}
abgeglichen werden. \P
erstellt eine Komplementklasse, die aus Codepunkten ohne die angegebene Eigenschaft besteht.
Wenn das i
-Flag gesetzt ist, werden \P
Zeichenklassen im u
- und v
-Modus leicht unterschiedlich behandelt. Im u
-Modus erfolgt die Kleinschreibung nach der Subtraktion, im v
-Modus erfolgt die Kleinschreibung vor der Subtraktion. Konkret gesagt, im u
-Modus entspricht \P{property}
caseFold(allCharacters - charactersWithProperty)
. Das bedeutet, dass /\P{Lowercase_Letter}/iu
immer noch "a"
trifft, weil A
kein Lowercase_Letter
ist. Im v
-Modus entspricht \P{property}
caseFold(allCharacters) - caseFold(charactersWithProperty)
. Das bedeutet, dass /\P{Lowercase_Letter}/iv
"a"
nicht trifft, weil A
nicht einmal in der Menge aller klein geschriebenen Unicode-Zeichen enthalten ist. Siehe auch Komplementklassen und kasusinsensitives Matching.
Um mehrere Eigenschaften zu kombinieren, verwenden Sie die Zeichensatz-Schnittmenge-Syntax, die mit dem v
-Flag aktiviert wird, oder sehen Sie sich die Muster-Subtraktion und Schnittmenge an.
Im v
-Modus kann \p
eine Sequenz von Codepunkten treffen, die in Unicode als "Eigenschaften von Zeichenketten" definiert sind. Dies ist besonders nützlich für Emojis, die oft aus mehreren Codepunkten bestehen. \P
kann jedoch nur Zeichen-Eigenschaften komplementieren.
Hinweis:
Es gibt Pläne, die Funktion "Eigenschaften von Zeichenketten" auch in den u
-Modus zu portieren.
Beispiele
Allgemeine Kategorien
Allgemeine Kategorien werden verwendet, um Unicode-Zeichen zu klassifizieren, und Unterkategorien sind verfügbar, um eine genauere Kategorisierung zu definieren. Es ist möglich, sowohl kurze als auch lange Formen in Unicode-Eigenschaftsausdrücken zu verwenden.
Sie können verwendet werden, um Buchstaben, Zahlen, Symbole, Satzzeichen, Leerzeichen usw. zu vergleichen. Für eine ausführlichere Liste der allgemeinen Kategorien, verweisen wir auf die 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 (conjunction of all the subcategories using short aliases)
story.match(/\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}/gu);
Skripte und Skripterweiterungen
Einige Sprachen verwenden unterschiedliche Skripte für ihr Schriftsystem. Zum Beispiel werden Englisch und Spanisch im lateinischen Skript geschrieben, während Arabisch und Russisch mit anderen Skripten (respektive Arabisch und Kyrillisch) geschrieben werden. Die Unicode-Eigenschaften Script
und Script_Extensions
erlauben regulären Ausdrücken, Zeichen entsprechend dem Skript abzugleichen, mit dem sie hauptsächlich verwendet werden (Script
) oder entsprechend der Menge der Skripte, zu denen sie gehören (Script_Extensions
).
Zum Beispiel gehört A
zum Latin
-Skript und ε
zum Greek
-Skript.
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); // Л
Für mehr Details verweisen wir auf die Unicode-Spezifikation, die Skripttabelle in der ECMAScript-Spezifikation, und die ISO 15924 Liste der Skriptcodes.
Wenn ein Zeichen in einem begrenzten Satz von Skripten verwendet wird, wird die Script
-Eigenschaft nur für das "vorherrschend" verwendete Skript übereinstimmen. Wenn wir Zeichen basierend auf einem "nicht-vorherrschenden" Skript abgleichen möchten, könnten wir die Script_Extensions
-Eigenschaft (kurz scx
) verwenden.
// ٢ 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-Eigenschaftsflüchte vs. Zeichenklassen
Mit JavaScript-Regulären Ausdrücken ist es auch möglich, Zeichenklassen und insbesondere \w
oder \d
zu verwenden, um Buchstaben oder Ziffern abzugleichen. Solche Formen treffen jedoch nur Zeichen des lateinischen Skripts (mit anderen Worten, a
bis z
und A
bis Z
für \w
und 0
bis 9
für \d
). Wie in diesem Beispiel gezeigt, könnte es etwas umständlich sein, mit nicht-lateinischen Texten zu arbeiten.
Unicode-Eigenschaftsausdrucks-Kategorien umfassen viel mehr Zeichen und \p{Letter}
oder \p{Number}
funktionieren für jedes Skript.
// Trying to use ranges to avoid \w limitations:
const nonEnglishText = "Приключения Алисы в Стране чудес";
const regexpBMPWord = /([\u0000-\u0019\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 einem String 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"]
Zeichenketten abgleichen
Mit dem v
-Flag kann \p{…}
Zeichenketten abgleichen, die potenziell länger als ein Zeichen sind, indem eine Eigenschaft von Zeichenketten verwendet wird:
const flag = "🇺🇳";
console.log(flag.length); // 2
console.log(/\p{RGI_Emoji_Flag_Sequence}/v.exec(flag)); // [ '🇺🇳' ]
Sie können jedoch nicht \P
verwenden, um "eine Zeichenkette ohne eine Eigenschaft" abzugleichen, da unklar ist, wie viele Zeichen konsumiert werden sollen.
/\P{RGI_Emoji_Flag_Sequence}/v; // SyntaxError: Invalid regular expression: Invalid property name
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # prod-CharacterClassEscape |
Browser-Kompatibilität
Siehe auch
- Zeichenklassen Leitfaden
- Reguläre Ausdrücke
- Zeichenklasse:
[...]
,[^...]
- Zeichenklassen-Flucht:
\d
,\D
,\w
,\W
,\s
,\S
- Zeichenflucht:
\n
,\u{...}
- Disjunktion:
|
- Unicode-Zeicheneigenschaft auf Wikipedia
- ES2018: RegExp Unicode Property Escapes von Dr. Axel Rauschmayer (2017)
- Unicode reguläre Ausdrücke § Eigenschaften
- Unicode-Dienstprogramme: UnicodeSet
- RegExp v-Flag mit Mengenotation und Eigenschaften von Zeichenketten auf v8.dev (2022)