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



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

[A-Za-z]

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

172   4  

4 ответов:

то, что вы ищете свойства Юникода.

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

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

\p{L}+

есть много таких свойств, для получения более подробной информации см. regular-expressions.info

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

Pattern.UNICODE_CHARACTER_CLASS

в Java 7 есть новое свойство Pattern.UNICODE_CHARACTER_CLASS что позволяет Юникод версия предопределенных классов символов смотрите мой ответ здесь для получения более подробной информации и ссылки

вы могли бы сделать что-то подобное

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

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

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

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

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

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

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

    Ничего не найдено.

Добавить ответ:
Отменить.