让我们说一句话:“Aiavärav”。表达式\w+
应该捕获这个单词,但字母“ä”将单词缩减为一半。而不是“Aiavärav”,我得到了“Aia”。包含那些非ascii字母的单词的正确正则表达式是什么?
答案 0 :(得分:12)
根据the documentation,\w
仅匹配[a-zA-Z_0-9]
,除非您指定UNICODE_CHARACTER_CLASS
标记:
Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS)
或在模式中嵌入(?U)
:
Pattern.compile("(?U)\\w+")
其中任何一个都需要JDK 1.7(即Java 7)。
如果您没有Java 7,可以使用\w
(“letter”;类似\p{L}
,但不是ASCII特定的)和{{[a-zA-Z]
将\p{N}
推广到Unicode。 1}}(“数字”;类似[0-9]
,但不是特定于ASCII的):
Pattern.compile("[\\p{L}_\\p{N}]+")
但听起来好像你正在寻找实际的单词,在正常意义上(与编程语言的意义相反),并且不需要支持数字和下划线?在这种情况下,您可以使用\p{L}
:
Pattern.compile("\\p{L}+")
(顺便说一下,大括号实际上是可选的 - 你可以写\pL
而不是p{L}
和\pN
而不是\p{N}
- 但人们通常会将它们包括在内,因为它们是多字母类别所必需的,例如\p{Lu}
“大写字母”。)