2012-06-05 101 views
52

为了配合A到Z,我们将使用正则表达式:Java正则表达式支持Unicode吗?

[A-ZA-Z]

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

+0

在Java 7,正则表达式的Unicode与'UNICODE_CHARACTER_CLASS'标志ö支持可嵌入的'(?U)'。请参阅http://stackoverflow.com/questions/4304928/unicode-equivalents-for-w-and-b-in-java-regular-expressions –

回答

79

你在找什么是Unicode属性。

例如\p{L}是任何一种字母的任何语言

所以一个正则表达式匹配这样一个中国字就应该像这样

\p{L}+ 

有很多这样的特性,详细内容见regular-expressions.info

另一种选择是使用修改

Pattern.UNICODE_CHARACTER_CLASS

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

你可以做这样的事情

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

\w将匹配来自任何语言的所有字母和所有数字(当然还有一些字结合字符如_)。

7

要匹配单个字符,您可以简单地将它们包含在字符类中,可以是文字或通过\u03FB语法。

很明显,您经常无法在表意语言中列出所有允许的字符。为了使正则表达式根据类型或代码块处理Unicode字符,支持定义为here的各种其他转义字符。请参阅“Unicode支持”一节,特别是对Character类的引用以及Unicode标准本身。

+0

如何连接用户输入的多个utf8字符,例如环保部,因为用户将会随机输入字符数 – cometta

+1

就像匹配多个拉丁字符:'[az] +'或'[az] {3}'或甚至'[az] {2,10}'。唯一不同的是你在量词所适用的角色类中所允许的。 –

3
  • 的Java正则表达式API工作于char
  • char类型是隐含UTF-16
  • 如果你有UTF-8的数据,你需要将它转码为UTF-16上的输入,如果这还没有完成

Unicode是通用字符集,UTF-8可以描述所有字符(包括控制字符,标点符号,字母等)。您必须更具体地了解你想要包括什么和什么你蚂蚁排除。 Java正则表达式使用\p{category}语法通过category来匹配代码点。请参阅Unicode standard以了解类别的list

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

6

为了解决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());