Java - 正则表达式匹配多个单词

4
假设您想要使用以下正则表达式匹配字符串:
".when is (\w+)." - 我正在尝试获取'when is'之后的事件
我可以使用matcher.group(index)来获取事件,但如果事件是像Veteran's Day这样的两个单词,则这种方法无法工作。我只能获取'when is'之后的第一个单词。
那么我应该使用什么正则表达式来获取'when is'之后的所有单词呢?

此外,假设我想捕获某人的生日,例如:
'when is * birthday'
如何使用正则表达式捕获is和birthday之间的所有文本?

\w 不包含空格或引号。 - Casimir et Hippolyte
\w === [a-zA-Z0-9_] - Sam
抱歉,实际上我是指(\w+)而不是(\w+)。 - user1414202
@user3692525,当你写\w时,我们假设你的意思是正则表达式\w,在Java字符串语法中表示为\\w - merlin2011
同样地,我们在相同的假设下书写我们的答案。 - merlin2011
5个回答

8
你可以尝试这个方法:
^when is (.*)$

这将查找以when is开头的字符串,并捕获到该行末尾的所有内容。

正则表达式将返回一个组。您可以像这样访问它:

String line = "when is Veteran's Day.";
Pattern pattern = Pattern.compile("^when is (.*)$");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
    System.out.println("group 1: " + matcher.group(1));
    System.out.println("group 2: " + matcher.group(2));
}

输出应该是:

group 1: when is Veteran's Day.
group 2: Veteran's Day.

谢谢您的快速回答!我只有一个小问题。如何获取您正则表达式的所有分组?非常感谢。 - user1414202
谢谢roydukkey!最后一个请求——抱歉打扰你了……假设我想捕获某人的生日,比如“什么时候是*的生日”,我该如何使用正则表达式捕获is和birthday之间的所有文本? - user1414202
你可以尝试这个 when is (.*) birthday - roydukkey
看起来你对正则表达式还不熟悉。这是一个非常好的资源!http://roydukkey.com/regular-expression-pocket-reference/ - roydukkey

2

如果您想匹配空格,您应该明确地允许空格。

([\w\s]+)

然而,如果你想捕获when is之后的所有内容,roydukkey的解决方案将会起作用。

1
不必要时不要使用正则表达式!尽管正则表达式的理论很美,因为你可以让一个字符串执行代码操作,但对于简单的用例来说它非常耗费内存。
如果你想获取以“when is”结尾的单词,可以这样做:
String start = "when is ";
String end = " ";
int startLocation = fullString.indexOf(start) + start.length();
String afterStart = fullString.substring(startLocation, fullString.length());
String word = afterStart.substring(0, afterStart.indexOf(end));

如果您知道最后一个单词是“Day”,您只需要将end =“Day”并添加该字符串的长度,以确定第二个子字符串的结束位置。

我倾向于同意。 - roydukkey
我以前总是这样做,但是写了太多的代码后感到厌烦了。我认为正则表达式会意味着更少的代码行数,并且更容易满足我的当前需求。 - user1414202
这真的取决于你如何使用正则表达式以及你的程序的需求。你可能需要考虑执行频率、受众和其他各种因素。正则表达式是我最喜欢的脚本之一,但有时它们会成为效率的祸根。 - roydukkey
1
我刚刚看到一家公司重新做了一个使用Perl正则表达式完成的整个项目,并将其转换为各种Java解析技术,因为Perl由于线程同时执行正则表达式而导致严重滞后。实际上,这只是找到那行代码的问题,无论是识别类似文本字符串还是必须识别的模式。 - tmanion

0
你可以将其表达为字符类,并在其中包含空格:when is ([\w ]+)

0

\w 只包括单词字符,不包括空格。请使用 [\w ]+ 代替。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接