使用Java regexp匹配(例如)Unicode字母
StackOverflow上有许多问题和答案,假设“字母”可以在[a-zA-Z]
的正则表达式中匹配。 然而,对于Unicode,还有更多的字符,大多数人会认为是一个字母(所有的希腊字母,Cyrllic ..还有更多.Unicode定义了许多块,每个块可能有“字母”。
Java定义为像alpha字符这样的东西定义了Posix类 ,但是它被指定为仅使用US-ASCII。 预定义的字符类定义由[a-zA-Z_0-9]
组成的单词,它也排除了许多字母。
那么如何正确匹配Unicode字符串呢? 有没有其他图书馆能够做到这一点?
在这里你有一个非常好的解释:
http://www.regular-expressions.info/unicode.html
一些提示:
“遗憾的是,Java和.NET不支持\X
(尚未)。使用\P{M}\p{M}*
作为替代。要匹配任意数量的字素,请使用(?:\P{M}\p{M}*)+
而不是\X+
。“
“在Java中,正则表达式令牌\uFFFF
仅匹配指定的代码点,即使您打开规范等效。但是,相同的语法\uFFFF
也用于将Unicode字符插入Java源代码中的文字字符串中\uFFFF
Pattern.compile("\u00E0")
将匹配à
的单代码点和双代码点编码,而Pattern.compile("\\u00E0")
仅匹配单代码点版本。记住写时作为Java字符串文字的正则表达式,反斜杠必须被转义。前Java代码编译正则表达式à
,而后者编译\u00E0
。根据你正在做的事情,差异可能很大。
你在谈论Unicode类别,比如字母吗? 它们与\p{CAT}
forms的正则表达式匹配,其中“CAT”是类似于L
的字母代码,或者类似Lu
的大写字母或Lt
代表title-case。
引用java.util.regex.Pattern的JavaDoc。
Unicode支持
此类符合Unicode技术标准#18的第1级: Unicode正则表达式指南 ,以及RL2.1规范等效项。
Java源代码中的Unicode转义序列(例如\ u2014)将按照Java语言规范的§3.3中的描述进行处理。 这种转义序列也可以由正则表达式解析器直接实现,这样Unicode转义就可以用在从文件或键盘读取的表达式中。 因此字符串“\ u2014”和“\\ u2014”虽然不相等,但编译成相同的模式,该模式匹配具有hex值0x2014的字符。
Unicode块和类别使用Perl中的\ p和\ P结构编写。 如果输入具有属性prop,则\ p {prop}匹配,而如果输入具有该属性,则\ P {prop}不匹配。 使用前缀In指定块,如InMongolian中所示。 可以使用可选前缀Is指定类别:\ p {L}和\ p {IsL}都表示Unicode字母的类别。 块和类别可以在字符类的内部和外部使用。
支持的类别是Character类指定的版本中的Unicode标准类别。 类别名称是标准中定义的类别,包括规范性和信息性。 Pattern支持的块名称是UnicodeBlock.forName接受和定义的有效块名称。