Java正则表达式支持Unicode?

时间:2012-06-05 08:42:49

标签: java regex unicode cjk

要匹配A到Z,我们将使用正则表达式:

  

[A-ZA-Z]

如何让正则表达式匹配用户输入的utf8字符?例如中文单词如环保部

4 个答案:

答案 0 :(得分:98)

您正在寻找的是Unicode属性。

e.g。 \p{L}是来自任何语言的任何类型的信件

所以匹配这样一个中文单词的正则表达式可能类似于

\p{L}+

有许多此类属性,有关详细信息,请参阅regular-expressions.info

另一个选择是使用修饰符

Pattern.UNICODE_CHARACTER_CLASS

在Java 7中有一个新属性Pattern.UNICODE_CHARACTER_CLASS,它支持预定义字符类see my answer here for some more details and links的Unicode版本

你可以做这样的事情

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

\w会匹配任何语言的所有字母和所有数字(当然还有一些单词组合_等字符。)

答案 1 :(得分: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());

答案 2 :(得分:7)

要匹配单个字符,您只需将它们包含在字符类中,可以是文字,也可以是\u03FB语法。

显然,您经常无法列出表意语言中允许的所有字符。为了使正则表达式根据其类型或代码块处理unicode字符,支持定义here的各种其他转义。请查看“Unicode支持”部分,尤其是对Character类和Unicode标准本身的引用。

答案 3 :(得分:3)

  • Java正则表达式API适用于char类型
  • char类型隐式为UTF-16
  • 如果您有UTF-8数据,则需要在输入时将其转码为UTF-16(如果尚未完成)

Unicode是通用字符集,UTF-8可以描述所有字符(包括控制字符,标点符号,字母等)。您必须更具体地说明要包含的内容和所需内容排除。 Java正则表达式使用\p{category}语法通过category匹配代码点。有关Unicode standard类别的信息,请参阅list

如果您想识别和分离一系列表意文字中的单词,您需要查看更复杂的API。我会从BreakIterator类型开始。