Unicode escape-последовательности для классов символов: \p{...}, \P{...}
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Escape-последовательность для класса символов Unicode — это разновидность escape-последовательности для класса символов, которая соответствует набору символов, указанных свойством Unicode. Она поддерживается только в режиме с учетом Unicode. Когда включен флаг v, его также можно использовать для сопоставления строк конечной длины.
Попробуйте
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 ["¥", "."]
Синтаксис
\p{loneProperty}
\P{loneProperty}
\p{property=value}
\P{property=value}
Параметры
-
loneProperty -
Единственное имя или значение свойства Unicode, следуя тому же синтаксису, что и
value. Оно указывает значение для свойстваGeneral_Categoryили имя бинарного свойства. В режимеvэто также может быть бинарное свойство Unicode строк.Примечание: Синтаксис ICU позволяет опускать имя свойства
Script, но JavaScript не поддерживает это, поскольку в большинстве случаевScript_Extensionsполезнее, чемScript. -
property - Имя свойства Unicode. Должно состоять из ASCII-букв (
A–Z,a–z) и подчеркиваний (_), и должно быть одним из имен небинарных свойств. -
value - Значение свойства Unicode. Должно состоять из ASCII-букв (
A–Z,a–z), подчеркиваний (_) и цифр (0–9) и должно быть одним из поддерживаемых значений, перечисленных вPropertyValueAliases.txt.
Описание
\p и \P поддерживаются только в режиме с учетом Unicode. В режиме без учета Unicode они являются identity escapes для символа p или P.
Каждый символ Unicode имеет набор свойств, которые его описывают. Например, символ a имеет свойство General_Category со значением Lowercase_Letter и свойство Script со значением Latn. Escape-последовательности \p и \P позволяют сопоставлять символ на основе его свойств. Например, a можно сопоставить с помощью \p{Lowercase_Letter} (имя свойства General_Category необязательно), а также \p{Script=Latn}. \P создает комплементарный класс, состоящий из кодовых точек без указанного свойства.
Когда установлен флаг i, классы символов \P обрабатываются немного по-разному в режимах u и v. В режиме u case-folding происходит после вычитания; в режиме v case-folding происходит до вычитания. Более конкретно, в режиме u \P{property} соответствует caseFold(allCharacters - charactersWithProperty). Это означает, что /\P{Lowercase_Letter}/iu все еще соответствует "a", потому что A не является Lowercase_Letter. В режиме v \P{property} соответствует caseFold(allCharacters) - caseFold(charactersWithProperty). Это означает, что /\P{Lowercase_Letter}/iv не соответствует "a", потому что A даже не входит в набор всех Unicode-символов, приведенных к нижнему регистру. См. также комплементарные классы и сопоставление без учета регистра.
Для составления нескольких свойств используйте синтаксис пересечения наборов символов, включенный с флагом v, или см. вычитание и пересечение шаблонов.
В режиме v \p может сопоставляться с последовательностью кодовых точек, определенных в Unicode как "свойства строк". Это наиболее полезно для эмодзи, которые часто состоят из нескольких кодовых точек. Однако \P может дополнять только свойства символов.
Примечание: Существуют планы по портированию функции свойств строк также и в режим u.
Примеры
Общие категории
Общие категории используются для классификации символов Unicode, а подкатегории доступны для более точной категоризации. В escape-последовательностях свойств Unicode можно использовать как короткие, так и длинные формы.
Их можно использовать для сопоставления букв, цифр, символов, знаков препинания, пробелов и т. д. Для более полного списка общих категорий обратитесь к спецификации Unicode.
// 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);
Шрифты и расширения шрифтов
Некоторые языки используют разные шрифты для своей письменности. Например, английский и испанский языки пишутся латинским шрифтом, в то время как арабский и русский — другими шрифтами (соответственно арабским и кириллическим). Свойства Unicode Script и Script_Extensions позволяют регулярным выражениям сопоставлять символы в соответствии со шрифтом, в котором они в основном используются (Script), или в соответствии с набором шрифтов, к которым они принадлежат (Script_Extensions).
Например, A относится к шрифту Latin, а ε — к шрифту 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); // Л
Для получения дополнительной информации обратитесь к спецификации Unicode, таблице шрифтов в спецификации ECMAScript и списку кодов шрифтов ISO 15924.
Если символ используется в ограниченном наборе шрифтов, свойство Script будет соответствовать только "основному" используемому шрифту. Если мы хотим сопоставлять символы на основе "неосновного" шрифта, мы можем использовать свойство Script_Extensions (для краткости 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]
Escape-последовательности свойств Unicode по сравнению с классами символов
С помощью регулярных выражений JavaScript также можно использовать классы символов, и особенно \w или \d, для сопоставления букв или цифр. Однако такие формы сопоставляют только символы из латинского шрифта (другими словами, a до z и A до Z для \w и 0 до 9 для \d). Как показано в этом примере, работать с нелатинскими текстами может быть несколько неудобно.
Категории escape-последовательностей свойств Unicode охватывают гораздо больше символов, и \p{Letter} или \p{Number} будут работать для любого шрифта.
// 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));
Сопоставление цен
Следующий пример сопоставляет цены в строке:
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"]
Сопоставление строк
С флагом v \p{…} может сопоставлять строки длиной более одного символа, используя свойство строк:
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)); // [ '🇺🇳' ]
Однако вы не можете использовать \P для сопоставления "строки, не имеющей свойства", поскольку неясно, сколько символов следует использовать.
/\P{RGI_Emoji_Flag_Sequence}/v; // SyntaxError: Invalid regular expression: Invalid property name
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
unicode_character_class_escape |
64 |
79 |
78 |
51 |
11.1 |
64 |
79 |
47 |
11.3 |
9.0 |
64 |
11.3 |
1.0.0 |
1.0 |
10.0.0 |
См. также
- Руководство по классам символов
- Регулярные выражения
- Класс символов:
[...],[^...] - Escape-последовательность класса символов:
\d,\D,\w,\W,\s,\S - Escape-последовательность символа:
\n,\u{...} - Дизъюнкция:
| - Свойство символов Unicode в Википедии
- ES2018: Escape-последовательности свойств Unicode в RegExp от доктора Акселя Раушмаера (2017)
- Регулярные выражения Unicode § Свойства
- Утилиты Unicode: UnicodeSet
- Флаг v в RegExp с обозначением множеств и свойствами строк на v8.dev (2022)
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Unicode_character_class_escape