Вопрос по java, unicode, regex – Java регулярное выражение для поддержки Unicode?

61

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

[A-Za-z]

Как разрешить регулярному выражению совпадать с введенными пользователем символами utf8? Например, китайские слова, такие как & # x73AF; & # x4FDD; & # x90E8;

В Java 7 регулярное выражение Unicode поддерживается сUNICODE_CHARACTER_CLASS флаг или встраиваемый(?U), Увидетьstackoverflow.com/questions/4304928/… Alastair McCormack

Ваш Ответ

4   ответа
7

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

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

Error: User Rate Limit Exceeded[a-z]+Error: User Rate Limit Exceeded[a-z]{3}Error: User Rate Limit Exceeded[a-z]{2,10}Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded cometta
3
  • the Java regular expression API works on the char type
  • the char type is implicitly UTF-16
  • if you have UTF-8 data you will need to transcode it to UTF-16 on input if this is not already being done

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

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

93

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

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

8

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

Похожие вопросы