Как стать автором
Обновить

Хватит использовать [a-zа-яё]: правильная работа с символами и категориями Unicode в регулярных выражениях

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров10K
Всего голосов 20: ↑20 и ↓0+20
Комментарии8

Комментарии 8

Спасибо, сохраню в тематическую подборку (такая как бы карта минного поля Юникода).

Как говорится, если у вас была проблема, которую вы решили с помощью регулярного выражения, то теперь у вас две проблемы.

Вот всегда эти мелкие различия в реализации RegEx раздражали.

Спасибо за статью. Интересное чтиво, когда с этим мало сталкиваешься. Вот только по прочтении у меня ощущение, что чего-то не хватает. Потому что, я не понимаю почему в списке категорий одни оканчиваются на звёздочку, а другие - нет. Логично было бы об этом упомянуть либо сразу после списка, либо перед, но я не нашёл ничего. Можно пояснить что эта "*" в конце значит? Например, возьмём последний блок категорий "\p{Cf} или \p{Format} – невидимый индикатор форматирования. *" и "\p{Co} или \p{Private_Use} – любой код, зарезервированный для частного использования."

Спасибо, добавлю пояснение. Их в оригинальном материале не было, добавил от себя. Это ссылки (сливаются с обычным текстом до наведения) на сторонний ресурс, где можно для примера взглянуть на конкретные коды, которые относятся к данной категории. Группы с неявно привязанными кодами ({Private_Use}, {Surrogate} и {Unassigned}) или являющиеся объединением других подкатегорий ссылок не имеют. Также не указывал ссылки для {Paragraph_Separator} и {Line_Separator}, где всего по одному коду.

Свойства Unicode вообще очень много проблем решают. К примеру, если нам на сайте нужно дать пользователю возможность использовать в нике буквы любого алфавита, со свойствами Unicode регулярка будет очень лаконичной. Попытка сделать то же самое без свойств Unicode... Честно говоря, страшно себе представить регулярку таких циклопических размеров.

Очень жаль, что не написано что же использовать вместо [a-zа-яё]

Пост в целом отвечает на этот вопрос – категорию \p{L} и её подкатегории. В частных случаях можно посмотреть на категорию письменности или их комбинацию, но там будут и небуквенные символы.

Если реализация не поддерживает категории, то уже нужно смотреть конкретные доки. В Python, к примеру, стандартный re не поддерживает, и нужно или использовать сторонние модули, или как-то выкручиваться через str.isalpha(), который как раз и отсылает к категориям Юникода. \w в re работает аналогично str.isalnum(), потому найдёт весь \p{L}, но вместе с \p{N} и _. С флагом ASCII будет работать аналогично реализациям с поддержкой категорий, где \w ограничивается только стандартной [a-z] латиницей + [0-9_].

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации