Сопоставление (например) буквы Unicode с регулярными выражениями Java - PullRequest
14 голосов
/ 15 марта 2011

В StackOverflow есть много вопросов и ответов, в которых предполагается, что «буква» может быть сопоставлена ​​в регулярном выражении на [a-zA-Z]. Однако в Юникоде есть еще много символов, которые большинство людей будет рассматривать как букву (все греческие буквы, кириллические ... и многие другие. Юникод определяет множество блоков , каждый из которых может иметь "буквы".

Определение Java определяет классы Posix для таких вещей, как буквенные символы, но это указано только для работы с US-ASCII. Предопределенные классы символов определяют слова, состоящие из [a-zA-Z_0-9], что также исключает много букв.

Так как же правильно сопоставлять строки Unicode? Есть ли какая-нибудь другая библиотека, которая понимает это правильно?

Ответы [ 3 ]

15 голосов
/ 15 марта 2011

Вот вам очень хорошее объяснение:

http://www.regular -expressions.info / unicode.html

Некоторые подсказки:

"К сожалению, Java и .NET не поддерживают \X (пока). Используйте \P{M}\p{M}* в качестве замены. Чтобы сопоставить любое количество графем, используйте (?:\P{M}\p{M}*)+ вместо \X+. "

" В Javaмаркер регулярного выражения \uFFFF соответствует только указанной кодовой точке, даже если вы включили каноническую эквивалентность. Однако тот же синтаксис \uFFFF также используется для вставки символов Unicode в буквенные строки в исходном коде Java. Pattern.compile("\u00E0") будетсоответствует кодировке с одинарной и двойной кодовой точкой à, тогда как Pattern.compile("\\u00E0") соответствует только версии с одной кодовой точкой. Помните, что при записи регулярного выражения в виде строкового литерала Java обратная косая черта должна быть исключена. Первый код Java компилирует регулярное выражение à, а второй - \u00E0. В зависимости от того, что вы делаете, разница может быть значительной. "

5 голосов
/ 15 марта 2011

Вы говорите о категориях Unicode, таких как буквы?Они соответствуют регулярному выражению в форме \p{CAT}, где "CAT" - это код категории, например L для любой буквы, или подкатегория, например Lu для прописных букв или Lt для заглавных букв.

2 голосов
/ 15 марта 2011

Цитирование из JavaDoc java.util.regex.Pattern .

Поддержка Unicode

Этот класс соответствует Уровень 1 Технического стандарта Unicode # 18: Руководство по регулярным выражениям Unicode , плюс канонические эквиваленты RL2.1.

escape-последовательности Юникода, такие как \ u2014 в исходном коде Java обработано, как описано в §3.3 Спецификация языка Java. такие escape-последовательности также реализованы непосредственно регулярным выражением синтаксический анализатор, так что экранирование Unicode может быть используется в выражениях, которые читаются из файлы или с клавиатуры. Таким образом строки "\ u2014" и "\\ u2014", в то время как не равно, скомпилировать в то же шаблон, который соответствует персонажу с шестнадцатеричным значением 0x2014.

Unicode блоки и категории записано с помощью конструкций \ p и \ P как в Perl. \ p {prop} соответствует, если вход имеет свойство prop, в то время как \ P {prop} не совпадает, если ввод имеет это свойство. Блоки указывается с префиксом В, как в InMongolian. Категории могут быть указывается с дополнительным префиксом Is: И \ p {L}, и \ p {IsL} обозначают категория Юникод букв. Блоки и категории могут быть использованы как внутри и вне класса персонажей.

Поддерживаются следующие категории: Стандарт Юникод в версии определяется классом символов. Имена категорий определены в Стандарт, как нормативный, так и познавательный. Поддерживаются имена блоков по шаблону - допустимые имена блоков приняты и определены UnicodeBlock.forName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...