使用Java regexp匹配(例如)Unicode字母

时间:2011-03-15 17:10:16

标签: java regex unicode character-properties character-class

StackOverflow上有很多问题和答案,假设“{”可以在[a-zA-Z]的正则表达式中匹配。然而,对于Unicode,还有更多的字符,大多数人会认为是一个字母(所有希腊字母,Cyrllic ......以及更多。Unicode defines many blocks每个字母可能都有“字母”。

用于字母字符的Java定义defines Posix classes,但指定仅用于US-ASCII。预定义的字符类定义由[a-zA-Z_0-9]组成的单词,其中也排除了许多字母。

那你如何正确匹配Unicode字符串呢?有没有其他的图书馆可以做到这一点?

3 个答案:

答案 0 :(得分:15)

这里有一个非常好的解释:

http://www.regular-expressions.info/unicode.html

一些提示:

“遗憾的是,Java和.NET不支持\X(尚未使用)。使用\P{M}\p{M}*作为替代。要匹配任意数量的字素,请使用(?:\P{M}\p{M}*)+代替\X+ }“。

“在Java中,正则表达式令牌\uFFFF仅匹配指定的代码点,即使您打开规范等效性。但是,相同的语法\uFFFF也用于将Unicode字符插入到文字字符串中在Java源代码中。Pattern.compile("\u00E0")将匹配à的单代码点和双代码点编码,而Pattern.compile("\\u00E0")仅匹配单代码点版本。请记住,在将正则表达式编写为Java字符串文字时,必须对反斜杠进行转义。前Java代码编译正则表达式à,而后者编译\u00E0。根据您正在执行的操作,区别可能很重要。“

答案 1 :(得分:5)

你在谈论Unicode类别,比如字母吗?它们与\p{CAT}形式的正则表达式匹配,其中“CAT”类似于任何字母的L类别代码,或类似Lu的大写字母或Lt类别对于标题案例。

答案 2 :(得分:2)

引自java.util.regex.Pattern的JavaDoc。

  

Unicode支持

     

本课程符合   Unicode技术标准#18的级别1:Unicode Regular Expression Guidelines,加上RL2.1 Canonical Equivalents。

     

Unicode转义序列,如   \ u2014在Java源代码中   按照§3.3中的描述进行处理   Java语言规范。这样   还实现了转义序列   直接由正则表达式   解析器,以便Unicode转义可以   用于从中读取的表达式   文件或键盘。就这样   字符串“\ u2014”和“\\ u2014”,而   不相等,编译成相同的   模式,匹配角色   十六进制值为0x2014。

     

Unicode块和类别   用\ p和\ P结构编写   就像在Perl中一样。 \ p {prop}匹配如果   输入具有属性prop,而   如果输入,则P {prop}不匹配   有那个属性。块是   使用前缀In指定,如   InMongolian。类别可能是   使用可选前缀Is指定:   \ p {L}和\ p {IsL}都表示   Unicode字母的类别。块   和类别可以在里面使用   在一个角色类之外。

     

支持的类别是   版本中的Unicode标准   由Character类指定。该   类别名称是在中定义的名称   标准,规范和   翔实。支持块名称   by Pattern是有效的块名称   接受和定义   UnicodeBlock.forName。