Соответствие (например) буквой 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.