Unicode-Zeichenklassenescapes: \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 2015.
Ein Unicode-Zeichenklassenescape ist eine Art von Zeichenklassenescape, das eine Menge von Zeichen entsprechend einer Unicode-Eigenschaft matched. Es wird nur im Unicode-bewussten Modus unterstützt. Wenn das v
-Flag aktiviert ist, kann es auch verwendet werden, um Zeichenketten von endlicher Länge zu matchen.
Probieren Sie es aus
Syntax
\p{loneProperty}
\P{loneProperty}
\p{property=value}
\P{property=value}
Parameter
loneProperty
-
Ein einzelner Unicode-Eigenschaftsname oder -wert, der dem gleichen Syntax folgt wie
value
. Es gibt den Wert für die EigenschaftGeneral_Category
an oder einen binären Eigenschaftsnamen. Imv
-Modus kann es auch eine binäre Unicode-Eigenschaft von Zeichenketten sein.Note: Die ICU-Syntax erlaubt es ebenfalls, den Eigenschaftsnamen
Script
wegzulassen, aber JavaScript unterstützt dies nicht, da meistScript_Extensions
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
gelistet sind.
Beschreibung
\p
und \P
werden nur im Unicode-bewussten Modus unterstützt. Im Unicode-unbewussten Modus sind sie Identitätsescapes für das Zeichen p
oder P
.
Jedes Unicode-Zeichen hat eine Reihe von Eigenschaften, die es beschreiben. Beispielsweise hat das Zeichen a
die Eigenschaft General_Category
mit dem Wert Lowercase_Letter
und die Eigenschaft Script
mit dem Wert Latn
. Die Escape-Sequenzen \p
und \P
ermöglichen es, ein Zeichen basierend auf seinen Eigenschaften zu matchen. Zum Beispiel kann a
durch \p{Lowercase_Letter}
(der General_Category
-Eigenschaftsname ist optional) sowie durch \p{Script=Latn}
gematcht werden. \P
erstellt eine Komplementklasse, die aus Codepoints ohne die angegebene Eigenschaft besteht.
Um mehrere Eigenschaften zu kombinieren, verwenden Sie die Syntax Zeichensatzschnittmenge, die mit dem v
-Flag aktiviert wird, oder siehe Mustersubtraktion und -schnittmenge.
Im v
-Modus kann \p
eine Sequenz von Codepoints matchen, die in Unicode als "Eigenschaften von Zeichenketten" definiert sind. Dies ist besonders nützlich für Emojis, die oft aus mehreren Codepoints bestehen. \P
kann jedoch nur Zeichen-Eigenschaften komplementieren.
Hinweis: Es gibt Pläne, die Eigenschaften von Zeichenketten auch in den u
-Modus zu portieren.
Beispiele
Allgemeine Kategorien
Allgemeine Kategorien werden verwendet, um Unicode-Zeichen zu klassifizieren, und Unterkategorien stehen zur Verfügung, um eine genauere Kategorisierung zu definieren. Es ist möglich, in Unicode-Eigenschaftsescapes sowohl kurze als auch lange Formen zu verwenden.
Sie können verwendet werden, um Buchstaben, Zahlen, Symbole, Interpunktionszeichen, Leerzeichen usw. zu matchen. Für eine umfassendere Liste allgemeiner Kategorien verweisen Sie bitte 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);
Schriften und Skripterweiterungen
Einige Sprachen verwenden verschiedene Schriften für ihr Schriftsystem. Zum Beispiel werden Englisch und Spanisch mit der lateinischen Schrift geschrieben, während Arabisch und Russisch mit anderen Schriften (jeweils Arabisch und Kyrillisch) geschrieben werden. Die Unicode-Eigenschaften Script
und Script_Extensions
erlauben regulären Ausdrücken, Zeichen entsprechend der Schrift zu matchen, mit der sie hauptsächlich verwendet werden (Script
) oder entsprechend dem Satz von Schriften, zu dem sie gehören (Script_Extensions
).
Zum Beispiel gehört A
zur Latin
-Schrift und ε
zur Greek
-Schrift.
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 weitere Details verweisen Sie bitte auf die Unicode-Spezifikation, die Scripts-Tabelle in der ECMAScript-Spezifikation und die ISO 15924-Liste der Schriftcodes.
Wenn ein Zeichen in einem begrenzten Satz von Schriften verwendet wird, wird die Eigenschaft Script
nur für die "vorherrschende" verwendete Schrift matchen. Wenn wir Zeichen basierend auf einer "nicht-vorherrschenden" Schrift matchen möchten, könnten wir die Eigenschaft Script_Extensions
verwenden (Scx
als Kurzform).
// ٢ 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-Eigenschaftsescapes vs. Zeichenklassen
Mit JavaScript-Regulären Ausdrücken ist es auch möglich, Zeichenklassen zu verwenden und insbesondere \w
oder \d
, um Buchstaben oder Ziffern zu matchen. Solche Formen matchen jedoch nur Zeichen aus der Lateinischen Schrift (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, kann es etwas umständlich sein, mit nicht-lateinischen Texten zu arbeiten.
Unicode-Eigenschaftsescapes-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 matchen
Das folgende Beispiel matched Preise in einem String:
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 matchen
Mit dem v
-Flag kann \p{…}
Zeichenketten matchen, 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 \P
nicht verwenden, um "eine Zeichenkette, die keine Eigenschaft hat" zu matchen, da unklar ist, wie viele Zeichen konsumiert werden sollten.
/\P{RGI_Emoji_Flag_Sequence}/v; // SyntaxError: Invalid regular expression: Invalid property name
Spezifikationen
Specification |
---|
ECMAScript Language Specification # prod-CharacterClassEscape |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
- Zeichenklassen Leitfaden
- Reguläre Ausdrücke
- Zeichenklasse:
[...]
,[^...]
- Zeichenklassenescape:
\d
,\D
,\w
,\W
,\s
,\S
- Zeichenescape:
\n
,\u{...}
- Disjunktion:
|
- Unicode-Zeicheneigenschaft auf Wikipedia
- ES2018: RegExp Unicode-Eigenschaftsescapes von Dr. Axel Rauschmayer (2017)
- Unicode-Reguläre Ausdrücke § Eigenschaften
- Unicode Utilities: UnicodeSet
- RegExp v-Flag mit Set-Notation und Eigenschaften von Zeichenketten auf v8.dev (2022)