Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Как описать все символы некоторого языка в регулярном выражении? Есть ли готовые решения?

Можно ли полагаться на то, что JVM «умным образом» разрешает диапазон "а-я" или "a-z" в регулярном выражении и добавляет в него все символы некоторого алфавита, который начинается на «а» и заканчивается на «я»?
Ответ: нет, диапазон читается буквально, и это можно подтвердить экспериментом
Символы Ё и ё не попадают в диапазон юникода, в котором лежат все кириллические символы русского языка. То же самое верно для существенной части других алфавитов: буквы в Unicode идут не подряд. Предлагаю отвлечься от особенностей кириллицы и подумать об абстрактном "a-z", где "a" и "z" — первая и последняя буква какого-то алфавита.
Есть ли в Java готовое решение для того, чтобы описать все "родные" буквы в заданной локали?
Ответ: в Java нет, но есть в ответе к этому вопросу
Нашел про поддержку локалей, но не вполне представляю, как это можно применить в регулярном выражении. Логично бы ожидать character class, какой-нибудь \p{locale_Ru_Ru}, но не нахожу.
Навеяно этим ответом к вопросу «Как определить не русский текст?»


Ответ

Регулярки просто включают диапазон между порядковыми значениями символов.
Полный кириллический диапазон безусловно включает Ёё и многое другое. Так что, чтобы собрать базовую кириллицу, достаточно задать диапазон вида [\x400-\x4ff] (не уверен что точный синтаксис для этого формата в Java).

Комментариев нет:

Отправить комментарий