Чтобы сопоставить A с Z, мы будем использовать регулярное выражение:
[A-Za-z]
Как разрешить регулярному выражению соответствовать символам utf8, введенным пользователем? Например, китайские слова вроде 环保 部
Ответы:
То, что вы ищете, - это свойства Unicode.
например \p{L}
, любое письмо с любого языка
Таким образом, регулярное выражение для соответствия такому китайскому слову может быть чем-то вроде
\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
типа.
UNICODE_CHARACTER_CLASS
флагом или встраиваемым(?U)
. См. Stackoverflow.com/questions/4304928/…