使用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接受和定义的有效块名称。