许多现代正则表达式实现将\w
字符类简写解释为“任何字母,数字或连接标点符号”(通常为下划线)。这样,像\w+
这样的正则表达式匹配hello
,élève
,GOÄ_432
或gefräßig
等字词。
不幸的是,Java没有。在Java中,\w
仅限于[A-Za-z0-9_]
。除了其他问题之外,这使得上面提到的匹配单词变得困难。
\b
字词分隔符似乎在不应该的位置匹配。
Java中类似.NET,支持Unicode的\w
或\b
的正确等价物是什么?哪些其他快捷方式需要“重写”以使其具有Unicode感知功能?
答案 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)。