Java正则表达式中\ w和\ b的Unicode等价物?

时间:2010-11-29 15:00:11

标签: java regex unicode character-properties

许多现代正则表达式实现将\w字符类简写解释为“任何字母,数字或连接标点符号”(通常为下划线)。这样,像\w+这样的正则表达式匹配helloélèveGOÄ_432gefräßig等字词。

不幸的是,Java没有。在Java中,\w仅限于[A-Za-z0-9_]。除了其他问题之外,这使得上面提到的匹配单词变得困难。

\b字词分隔符似乎在不应该的位置匹配。

Java中类似.NET,支持Unicode的\w\b的正确等价物是什么?哪些其他快捷方式需要“重写”以使其具有Unicode感知功能?

3 个答案:

答案 0 :(得分:234)

答案 1 :(得分:15)

\w不起作用真的很不幸。建议的解决方案\p{Alpha}对我来说也不起作用。

似乎[\p{L}]捕获了所有Unicode字母。因此,\w的等效Unicode应为[\p{L}\p{Digit}_]

答案 2 :(得分:7)

在Java中,\w\d不支持Unicode;它们仅匹配ASCII字符[A-Za-z0-9_][0-9]。同样适用于\p{Alpha}和朋友(他们所基于的POSIX“字符类”应该是区域设置敏感的,但在Java中它们只匹配ASCII字符)。如果你想匹配Unicode“单词字符”,你必须拼写出来,例如[\pL\p{Mn}\p{Nd}\p{Pc}],用于字母,非间距修饰符(重音符号),十进制数字和连接标点符号。

然而,Java的\b 精通Unicode;它使用Character.isLetterOrDigit(ch)并检查重音字母,但它识别的唯一“连接标点”字符是下划线。 编辑:当我尝试您的示例代码时,会按照应有的方式打印""élève"see it on ideone.com)。