Java регулярное выражение для поддержки Unicode?
Чтобы сопоставить от А до Я, мы будем использовать регулярное выражение:
[A-Za-Z]
Как разрешить регулярному выражению совпадать с введенными пользователем символами utf8? Например, китайские слова, такие как 环保部
5 ответов
То, что вы ищете, это свойства Unicode.
например \p{L}
любое письмо на любом языке
Таким образом, регулярное выражение в соответствии с таким китайским словом может быть что-то вроде
\p{L}+
Есть много таких свойств, для более подробной информации смотрите регулярные выражения.info
Другой вариант - использовать модификатор
Pattern.UNICODE_CHARACTER_CLASS
В Java 7 есть новое свойство Pattern.UNICODE_CHARACTER_CLASS
что позволяет использовать версию предопределенных классов символов в Юникоде, см. мой ответ здесь для получения дополнительной информации и ссылок.
Вы могли бы сделать что-то вроде этого
Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);
а также \w
будет соответствовать все буквы и все цифры из любых языков (и, конечно, некоторые сочетания слов, такие как _
).
Чтобы обратиться к поддержке 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());
Чтобы сопоставить отдельные символы, вы можете просто включить их в класс символов, либо в виде литералов, либо через \u03FB
синтаксис.
Очевидно, что вы часто не можете перечислить все разрешенные символы на идеографических языках. Чтобы регулярное выражение обрабатывало символы Юникода в соответствии с их типом или блоком кода, поддерживаются различные другие экранированные символы, определенные здесь. Посмотрите на раздел "Поддержка Unicode", особенно ссылки на Character
класса и самого стандарта Unicode.
- API регулярных выражений Java работает на
char
тип -
char
тип неявно UTF-16 - если у вас есть данные UTF-8, вам нужно будет перекодировать их в UTF-16 на входе, если это еще не сделано
Unicode - это универсальный набор символов, и UTF-8 может описывать все это (включая управляющие символы, знаки препинания, символы, буквы и т. Д.). Вам нужно будет более точно указать, что вы хотите включить и что вы хотите исключить. Регулярные выражения Java используют \p{category}
синтаксис для сопоставления кодовых точек по категориям. См. Стандарт Unicode для списка категорий.
Если вы хотите идентифицировать и разделить слова в последовательности иероглифов, вам нужно взглянуть на более сложный API. Я бы начал с BreakIterator
тип.
Начиная с Java 9, вы также можете использовать\X
чтобы соответствовать любому расширенному кластеру графем Unicode. Подробнее см. в Java Doc: Pattern .