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 .

Другие вопросы по тегам