Соответствие (например) буквой Unicode с регулярными выражениями Java

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

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

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

Ответы

Ответ 1

Здесь у вас есть очень приятное объяснение:

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

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

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

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

Ответ 2

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

Ответ 3

Цитата из JavaDoc java.util.regex.Pattern.

Поддержка Unicode

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

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

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

Поддерживаемые категории - это категории Стандарт Unicode в версии заданный классом Character. Названия категорий - это те, которые определены в Стандарт, как нормативный, так и информативный. Названия блоков поддерживаются по шаблону являются действительными именами блоков принимается и определяется UnicodeBlock.forName.