Spec-Zone.ru › JavaScript

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

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# prod-CharacterClassEscape

Совместимость с браузерами

Настольные компьютеры Мобильные устройства Сервер
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API