StackOverflow上有很多问题和答案,假设“{”可以在[a-zA-Z]
的正则表达式中匹配。然而,对于Unicode,还有更多的字符,大多数人会认为是一个字母(所有希腊字母,Cyrllic ......以及更多。Unicode defines many blocks每个字母可能都有“字母”。
用于字母字符的Java定义defines Posix classes,但指定仅用于US-ASCII。预定义的字符类定义由[a-zA-Z_0-9]
组成的单词,其中也排除了许多字母。
那你如何正确匹配Unicode字符串呢?有没有其他的图书馆可以做到这一点?
答案 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。