W3docs

Понимание Unicode в JavaScript: флаги и классы

Флаг "u" в регулярных выражениях JavaScript, суррогатные пары и экранирование свойств Unicode \p{...} и \P{...} для букв, цифр, скриптов и эмодзи.

Введение в Unicode

JavaScript поддерживает Unicode — стандарт кодирования символов, позволяющий представлять текст на множестве языков и письменных систем. Unicode необходим для разработки интернационализированных приложений и эффективной работы с разнородными текстовыми данными. В этой главе мы рассмотрим флаги и классы Unicode в JavaScript, изучим их применение и разберём практические примеры для углубления понимания.

Флаг Unicode u

Флаг u включает полное сопоставление Unicode в регулярных выражениях. По умолчанию регулярное выражение воспринимает string как последовательность кодовых единиц UTF-16. Символы вне Базовой многоязыковой плоскости (BMP) — эмодзи, многие математические символы и редкие письменности — хранятся в виде суррогатной пары: двух кодовых единиц, совместно кодирующих одну кодовую точку. Без флага u движок регулярных выражений видит эти две половины по отдельности, что нарушает работу ., диапазонов символов и квантификаторов для таких символов.

При установленном флаге u движок работает в терминах кодовых точек, а не кодовых единиц, поэтому один астральный символ считается одним символом.

Суррогатные пары и почему флаг важен

. совпадает с одним символом. Без u он совпадает только с одной кодовой единицей и не может самостоятельно совпасть с целым астральным символом.

javascript— editable

😀 — это суррогатная пара для 😀. String#length возвращает 2, поскольку считает кодовые единицы, тогда как преобразование строки в массив (который перебирается по кодовым точкам) возвращает 1. Без u /^.$/ не совпадает, так как . соответствует лишь одной из двух половин; с u он совпадает с полным символом.

Использование флага u

javascript— editable

Здесь 👍 — эмодзи «большой палец вверх». Без флага u регулярное выражение a.b не совпадает, потому что . поглощает лишь одну половину суррогатной пары. С флагом u символ . поглощает всю кодовую точку целиком, и шаблон совпадает.

Правильный подсчёт символов

Регулярное выражение с флагом u и флагом g позволяет перебирать настоящие символы, включая астральные.

javascript— editable

Комбинирование флага u с другими флагами

Флаг u сочетается с остальными флагами. В примере ниже добавлены глобальный (g) и регистронезависимый (i).

javascript— editable

Этот пример демонстрирует комбинирование флага u с глобальным (g) и регистронезависимым (i) флагами. Регулярное выражение корректно совпадает с A👍b, показывая, как флаг u можно использовать вместе с другими флагами для более гибкого поиска.

Экранирование свойств Unicode: \p{...} и \P{...}

Экранирование свойств Unicode предоставляет способ сопоставления символов на основе их свойств Unicode. Эта возможность, введённая в ECMAScript 2018, упрощает работу с определёнными типами символов.

Синтаксис экранирования свойств Unicode

  • \p{Property=Value}: совпадает с символами, имеющими указанное свойство.
  • \P{Property=Value}: совпадает с символами, не имеющими указанного свойства.

Распространённые свойства Unicode

Для однобуквенных основных категорий можно указывать имя свойства напрямую: \p{L} — сокращение от \p{General_Category=Letter}.

  1. Основная категория (General Category): совпадает с символами по их основной категории.
    • \p{L} (Letter): совпадает с любой буквой из любой письменности.
    • \p{N} (Number): совпадает с любым числовым символом.
    • \p{P} (Punctuation): совпадает со знаками пунктуации.
    • \p{Lu} / \p{Ll}: буквы в верхнем / нижнем регистре.
  2. Письменность (Script): совпадает с символами, принадлежащими определённой системе письма.
    • \p{Script=Greek} (или \p{sc=Greek}): греческие символы.
    • \p{Script=Han}: символы хань (китайский, японский, корейский).
    • \p{Script=Cyrillic}: кириллические символы.
  3. Бинарные свойства (Binary properties): совпадает с символами, имеющими заданный признак.
    • \p{Emoji}, \p{Emoji_Presentation}: символы эмодзи.
    • \p{White_Space}: пробельные символы.

Форма с заглавной буквой \P{...} является отрицанием — она совпадает с каждым символом, который не имеет данного свойства. Подробнее о синтаксисе с квадратными скобками [...] см. в разделе классы символов.

Примеры экранирования свойств Unicode

javascript— editable

Здесь \p{L} совпадает с любой буквой. Регулярное выражение \p{L}+ находит все последовательности букв в строке 'Hello123', возвращая ["Hello"].

javascript— editable

В этом примере \p{N} совпадает с любым числом. Регулярное выражение \p{N}+ извлекает все числовые последовательности из строки 'Hello123', возвращая ["123"].

javascript— editable

\P{L} является инверсией \p{L}, поэтому \P{L}+ захватывает фрагменты без букв — в данном случае "123!".

javascript— editable

Этот пример использует \p{Script=Greek} для сопоставления греческих символов. Регулярное выражение успешно совпадает с греческой строкой 'αβγδε'.

Сопоставление эмодзи

Поскольку \p{...} требует u, астральные эмодзи также обрабатываются корректно — каждый эмодзи воспринимается как один символ.

javascript— editable
Внимание

Использование экранирования свойств Unicode может снижать производительность, особенно при работе с большими объёмами текстовых данных. Оптимизируйте регулярные выражения и проверяйте их производительность в конкретном сценарии использования.

Практические применения

Валидация пользовательского ввода

Экранирование свойств Unicode позволяет точнее проверять пользовательский ввод, допуская только разрешённые символы.

javascript— editable

Это регулярное выражение проверяет, что допустимое имя пользователя начинается как минимум с двух букв, за которыми следует любая комбинация букв и цифр. 'User123' проходит валидацию, а '123User' — нет.

Извлечение определённых символов

С помощью экранирования свойств Unicode можно извлекать из строки определённые типы символов.

javascript— editable

В этом примере \p{L}+ совпадает со всеми последовательностями букв в строке 'Hello, κόσμε!', возвращая ["Hello", "κόσμε"].

Информация

Всегда используйте флаг u вместе с экранированием свойств Unicode

При использовании экранирования свойств Unicode всегда включайте флаг u для корректного сопоставления. Без этого флага экранирование свойств выбросит SyntaxError.

javascript— editable

Заключение

Понимание Unicode и его применение в JavaScript имеет ключевое значение для разработки надёжных, интернационализированных приложений. Используя флаг u и экранирование свойств Unicode, можно эффективнее работать с разнородными текстовыми данными и выполнять точное сопоставление символов. Применяйте эти техники в своих проектах, чтобы расширить их функциональность и обеспечить соответствие мировым стандартам.

Практика

Практика
Что изменяет флаг 'u' в регулярных выражениях JavaScript?
Что изменяет флаг 'u' в регулярных выражениях JavaScript?
Was this page helpful?