Java的正则表达式不能将其他语言中的字符识别为单词字符(即\ w)

jyr*_*and 6 java regex parsing

让我们说一句话:"Aiavärav".表达式\w+应该捕获这个词,但是字母"ä"将这个词减半.而不是"Aiavärav",我得到了"Aia".包含那些非ascii字母的单词的正确正则表达式是什么?

rua*_*akh 13

根据文档,除非您指定标志,否则\w仅匹配:[a-zA-Z_0-9]UNICODE_CHARACTER_CLASS

Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS)
Run Code Online (Sandbox Code Playgroud)

或嵌入(?U)模式:

Pattern.compile("(?U)\\w+")
Run Code Online (Sandbox Code Playgroud)

其中任何一个都需要JDK 1.7(即Java 7).

如果您没有Java 7,则可以\w使用\p{L}("letter";类似[a-zA-Z]但不特定于ASCII)和\p{N}("number";类似[0-9]但不是特定于ASCII)来推广到Unicode :

Pattern.compile("[\\p{L}_\\p{N}]+")
Run Code Online (Sandbox Code Playgroud)

但听起来好像你正在寻找实际意义上的实际单词(与编程语言意义相反),并且不需要支持数字和下划线?在这种情况下,您可以使用\p{L}:

Pattern.compile("\\p{L}+")
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,大括号实际上是可选的 - 你可以\pL代替p{L}\pN不是代替\p{N}- 但人们通常会包括它们,因为它们需要多字母类别,如\p{Lu}"大写字母".)