Java';s正则表达式don';无法将来自其他语言的字符识别为单词字符(即\w)

Java';s正则表达式don';无法将来自其他语言的字符识别为单词字符(即\w),java,regex,parsing,Java,Regex,Parsing,让我们说我有一个词:“友爱”。表达式\w+应该包含这个词,但字母“ä”将这个词一分为二。我得到的不是“Aiavärav”,而是“Aia”。对于包含这些非ascii字母的单词,什么是正确的正则表达式 根据,\w仅匹配[a-zA-Z_0-9],除非指定UNICODE_字符类标志: Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS) 或在模式中嵌入(?U): Pattern.compile("(?U)\\w+") 其中任何一个都需要JD

让我们说我有一个词:“友爱”。表达式
\w+
应该包含这个词,但字母“ä”将这个词一分为二。我得到的不是“Aiavärav”,而是“Aia”。对于包含这些非ascii字母的单词,什么是正确的正则表达式

根据,
\w
仅匹配
[a-zA-Z_0-9]
,除非指定
UNICODE_字符类
标志:

Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS)
或在模式中嵌入
(?U)

Pattern.compile("(?U)\\w+")
其中任何一个都需要JDK1.7(即Java7)

如果您没有Java 7,您可以通过使用
\p{L}
(“字母”;like
[a-zA-Z]
,但不特定于ASCII)和
\p{N}
(“数字”;like
[0-9]
,但不特定于ASCII)将
\w
概括为Unicode):

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

Pattern.compile("\\p{L}+")

(顺便说一句,花括号实际上是可选的-你可以写
\pL
而不是
p{L}
\pN
而不是
\p{N}
-但是人们通常还是会把它们包括在内,因为它们是多字母类别所必需的,比如
\p{Lu}
“大写字母”。)

我复制了您的单词并放入字符串,我使用了正则表达式\w+,我可以正确地获取单词。我正在用C#进行测试。我在用Java。我也用myregextester.com进行了测试,但它仍然不能识别整个单词。也许你想看看<代码>\p{L}+是的,我去那个网站测试。无法得到正确的结果。我再次测试了我的C#代码。我如期得到消息。字符串测试=“Aiavärav abc 123”;正则表达式reg=新正则表达式(@“\w+”);控制台写入(注册匹配(测试));我将“Aiavärav”更正为“非拉丁”,因为“ä”在技术上仍然是拉丁衍生字符。请注意,嵌入(?U)“…可能会造成性能损失。”来自@niconic:您链接到的文档实际上指的是
UNICODE_字符类
,而不是
(?U)
,但无论如何,我认为昂贵的部分是使用Unicode字符属性进行匹配(与ASCII字符组相比)。因为这正是OP想要做的,在他/她的情况下,这并不是真正的“性能惩罚”,并且可能适用于他可能采取的任何方法。也许我错了,但是在
UNICODE\U CHARACTER\U类
链接中,我读到的
UNICODE\U CHARACTER\U类模式也可以通过嵌入的标志表达式(?U)启用. ,所以我认为我们谈论的是相同的东西。我是不是误解了什么?当然,您的回答符合需要,我只想指出(因为我发现自己处于一个模糊不清的相似情况中,性能对我来说是至关重要的)@niconic:documentation声明可以通过
(?U)
启用此模式,但是,
UNICODE\U CHARACTER\U CLASS
标志可能会造成性能损失的声明在单独的一段中,因此不适用于
(?U)
。平心而论,我相信同样的说法也适用于
(?U)
;但我对你的评论感到担忧的是,我的回答列举了三种方法,你的评论说其中一种可能会对性能造成惩罚,就好像你在提倡其他两种方法一样。这是高度误导性的,因为(我相信)每种方法都有相同的惩罚。好吧,我得到了,我的评论可能是误导性的:当我写它的时候,我不想精确地针对?U标志,但它意味着什么(即所有方法)。
Pattern.compile("\\p{L}+")