Чтобы сопоставить такие слова, как Da̱nx̱a̱laga̱litła̱n, нужно ли указывать сопоставителю шаблонов объединять диакритические знаки?
Дэйв Джарвис
9
Чтобы сопоставить отдельные символы, вы можете просто включить их в класс символов либо как литералы, либо через \u03FBсинтаксис.
Очевидно, что вы часто не можете перечислить все разрешенные символы на идеографических языках. Чтобы регулярное выражение обрабатывало символы Юникода в соответствии с их типом или блоком кода, поддерживаются различные другие escape-последовательности, которые определены здесь . Посмотрите раздел «Поддержка Unicode», особенно ссылки на Characterкласс и сам стандарт Unicode.
как сопоставить несколько символов utf8, введенных в примере пользователя 环保 部, потому что пользователь будет вводить случайное количество символов
комета
1
Это похоже на совпадение нескольких латинских символов: [a-z]+или [a-z]{3}или даже [a-z]{2,10}. Единственное отличие - это то, что вы разрешаете в классе символов, к которому применяется квантификатор.
Kilian Foth 05
9
Чтобы обратиться к поддержке NLS и избежать приема специальных символов английского языка, мы можем использовать следующий шаблон ...
API регулярных выражений Java работает с charтипом
charтип неявно UTF-16
если у вас есть данные UTF-8, вам нужно будет перекодировать их в UTF-16 на входе, если это еще не сделано
Юникод - это универсальный набор символов, и UTF-8 может описать его все (включая управляющие символы, знаки препинания, символы, буквы и т. Д.). Вам нужно будет более конкретно указать, что вы хотите включить, а что исключить. Регулярные выражения Java используют \p{category}синтаксис для сопоставления кодовых точек по категориям . См стандарт Unicode для списка категорий.
Если вы хотите идентифицировать и разделять слова в последовательности идеограмм, вам потребуется более сложный API. Я бы начал с BreakIteratorтипа.
UNICODE_CHARACTER_CLASS
флагом или встраиваемым(?U)
. См. Stackoverflow.com/questions/4304928/…Ответы:
То, что вы ищете, - это свойства Unicode.
например
\p{L}
, любое письмо с любого языкаТаким образом, регулярное выражение для соответствия такому китайскому слову может быть чем-то вроде
Таких свойств много, подробнее см. Regular-expressions.info
Другой вариант - использовать модификатор
Pattern.UNICODE_CHARACTER_CLASS
В Java 7 есть новое свойство,
Pattern.UNICODE_CHARACTER_CLASS
которое позволяет использовать версию Unicode предопределенных классов символов, см. Мой ответ здесь для получения дополнительных сведений и ссылок.Вы могли бы сделать что-то вроде этого
Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);
и
\w
будет соответствовать всем буквам и всем цифрам из любых языков (и, конечно, некоторым словам, объединяющим символы, например_
).источник
Чтобы сопоставить отдельные символы, вы можете просто включить их в класс символов либо как литералы, либо через
\u03FB
синтаксис.Очевидно, что вы часто не можете перечислить все разрешенные символы на идеографических языках. Чтобы регулярное выражение обрабатывало символы Юникода в соответствии с их типом или блоком кода, поддерживаются различные другие escape-последовательности, которые определены здесь . Посмотрите раздел «Поддержка Unicode», особенно ссылки на
Character
класс и сам стандарт Unicode.источник
[a-z]+
или[a-z]{3}
или даже[a-z]{2,10}
. Единственное отличие - это то, что вы разрешаете в классе символов, к которому применяется квантификатор.Чтобы обратиться к поддержке NLS и избежать приема специальных символов английского языка, мы можем использовать следующий шаблон ...
[a-zA-Z0-9 \ u0080- \ u9fff] * +
Для справки по кодовой точке UTF: http://www.utf8-chartable.de/unicode-utf8-table.pl
Фрагмент кода:
String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ"; String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ"; String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ"; String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯"; String engChinesStr = "ABC導字會"; Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern .compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+"); System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels) .matches()); Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern .compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+"); Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern .compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+"); System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr) .matches());
источник
char
типомchar
тип неявно UTF-16Юникод - это универсальный набор символов, и UTF-8 может описать его все (включая управляющие символы, знаки препинания, символы, буквы и т. Д.). Вам нужно будет более конкретно указать, что вы хотите включить, а что исключить. Регулярные выражения Java используют
\p{category}
синтаксис для сопоставления кодовых точек по категориям . См стандарт Unicode для списка категорий.Если вы хотите идентифицировать и разделять слова в последовательности идеограмм, вам потребуется более сложный API. Я бы начал с
BreakIterator
типа.источник