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

时间:2012-02-09 02:22:35

标签: java regex parsing

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

1 个答案:

答案 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}“大写字母”。)