Java regex для поддержки Unicode?

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

[A-Za-Z]

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

Ответ 1

Что вы ищете, это свойства Unicode.

например. \p{L} - это любая буква с любого языка

Таким образом, регулярное выражение, соответствующее такому китайскому слову, может быть чем-то вроде

\p{L}+

Существует много таких свойств, более подробно см. regular-expressions.info

Другой вариант - использовать модификатор

Pattern.UNICODE_CHARACTER_CLASS

В Java 7 существует новое свойство Pattern.UNICODE_CHARACTER_CLASS, которое позволяет версию Unicode для предопределенных классов символов см. мой ответ здесь для получения более подробной информации и ссылок p >

Вы можете сделать что-то вроде этого

Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);

и \w будут соответствовать всем буквам и всем цифрам с любых языков (и, конечно, некоторое слово, объединяющее символы, такие как _).

Ответ 2

Чтобы соответствовать отдельным символам, вы можете просто включить их в класс символов, либо как литералы, либо через синтаксис \u03FB.

Очевидно, вы часто не можете перечислить все допустимые символы в идеографических языках. Чтобы регулярное выражение обрабатывало символы Юникода в соответствии с их типом или блоком кода, поддерживаются различные другие экраны, которые определены здесь. Посмотрите раздел "Поддержка Unicode", в частности ссылки на класс Character и на стандарт Unicode.

Ответ 3

Чтобы обратиться к поддержке 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());

Ответ 4

  • API регулярного выражения Java работает с типом char
  • тип char неявно UTF-16
  • Если у вас есть данные UTF-8, вам необходимо перекодировать его на UTF-16 на входе, если это еще не сделано.

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

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