Регулярное выражение Java для поддержки Unicode?

80

Чтобы сопоставить A с Z, мы будем использовать регулярное выражение:

[A-Za-z]

Как разрешить регулярному выражению соответствовать символам utf8, введенным пользователем? Например, китайские слова вроде 环保 部

комета
источник
2
В Java 7 регулярное выражение Unicode поддерживается с UNICODE_CHARACTER_CLASSфлагом или встраиваемым (?U). См. Stackoverflow.com/questions/4304928/…
Аластер МакКормак,

Ответы:

120

То, что вы ищете, - это свойства 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будет соответствовать всем буквам и всем цифрам из любых языков (и, конечно, некоторым словам, объединяющим символы, например _).

стебель
источник
Чтобы сопоставить такие слова, как 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 и избежать приема специальных символов английского языка, мы можем использовать следующий шаблон ...

[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());
Венкатешвара Рао
источник
3
  • API регулярных выражений Java работает с charтипом
  • charтип неявно UTF-16
  • если у вас есть данные UTF-8, вам нужно будет перекодировать их в UTF-16 на входе, если это еще не сделано

Юникод - это универсальный набор символов, и UTF-8 может описать его все (включая управляющие символы, знаки препинания, символы, буквы и т. Д.). Вам нужно будет более конкретно указать, что вы хотите включить, а что исключить. Регулярные выражения Java используют \p{category}синтаксис для сопоставления кодовых точек по категориям . См стандарт Unicode для списка категорий.

Если вы хотите идентифицировать и разделять слова в последовательности идеограмм, вам потребуется более сложный API. Я бы начал с BreakIteratorтипа.

Макдауэлл
источник