Сопоставление (например) буква Unicode с java regexps
-
24-10-2019 - |
Вопрос
Есть много вопросов и ответов здесь на Stackoverflow, которые предполагают, что «буква» может быть сопоставлено в режиме Regexp [a-zA-Z]
. Анкет Однако с Unicode есть гораздо больше персонажей, которые большинство людей считают буквой (все греческие буквы, Cyrllic ... и многое другое. Unicode определяет много блоков каждый из которых может иметь «буквы».
Определение Java Определяет классы POSIX Для таких вещей, как альфа-персонажи, но это указано только для работы с США-Аска. Предопределенные классы символов определяют слова для состояния [a-zA-Z_0-9]
, который также исключает много букв.
Итак, как вы правильно сочетать с строками Unicode? Есть ли другая библиотека, которая получает это правильно?
Решение
Здесь у вас есть очень хорошее объяснение:
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 Backslash необходимо избежать. Бывший код Java компилирует корпус à
, пока последний компилирует \u00E0
. Анкет В зависимости от того, что вы делаете, разница может быть значительной ».
Другие советы
Вы говорите о категориях Unicode, как буквы? Они соответствуют регуляции формы \p{CAT}
, где «кошка» - это код категории L
для любого письма или подкатегории, подобной Lu
для прописного или Lt
Для титульного казыW.
Цитируя из Javadoc java.util.regex.pattern.
Поддержка Unicode
Этот класс в соответствии с уровнем 1 технического стандарта Unicode #18: Руководящие принципы регулярного выражения Unicode, плюс канонические эквиваленты RL2.1.
Последовательности побега Unicode, такие как U2014 в исходном коде Java, обрабатываются, как описано в §3.3 спецификации языка Java. Такие последовательности побега также реализуются непосредственно анализатором регулярной экспрессии, так что уход Unicode можно использовать в выражениях, которые считываются из файлов или с клавиатуры. Таким образом, строки « u2014» и « u2014», хотя и не равны, компилируются в тот же шаблон, который соответствует персонажу с шестнадцатеричным значением 0x2014.
Блоки Unicode и категории написаны с конструкциями p и p, как в Perl. p {prop} соответствует, если у ввода есть Prop -Prop, а p {prop} не совпадает, если у ввода есть это свойство. Блоки указаны с префиксом в, как во Inmongolian. Категории могут быть указаны с помощью необязательного префикса: оба p {l} и p {ISL} обозначают категорию букв Unicode. Блоки и категории могут использоваться как внутри, так и снаружи класса символов.
Поддерживаемые категории являются категориями стандарта Unicode в версии, указанной классом символов. Названия категорий определены в стандарте, как нормативные, так и информативные. Имена блоков, поддерживаемые шаблоном, являются допустимыми именами блоков, принятыми и определены Unicodeblock.forname.