Java中的正则表达式:捕获最后{n}个单词

时间:2015-12-25 19:25:29

标签: java regex

您好我正在尝试在java中执行正则表达式,我需要捕获最后的{n}个单词。 (单词之间可能有一些变量的空格)。要求是必须在正则表达式中完成。 所以例如在

The man  is very   tall.

对于n = 2,我需要捕获

very   tall.

所以我试过

(\S*\s*){2}$

但这在java中不匹配,因为必须首先使用初始单词。所以我试过

^(.*)(\S*\s*){2}$

但是。*消耗一切,最后两个字被忽略。 我也试过

^\S?\s?(\S*\s*){2}$

有人知道解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

你的第一次尝试几乎得到了它。

只需将+更改为*

加号表示至少有一个字符,因为匹配失败时没有任何空格。

另一方面,星号表示从零到多,所以它会起作用。

在这里看看:(?:\S*\s*){2}$

使用replaceAll方法,您可以尝试使用此正则表达式:((?:\\S*\\s*){2}$)|.

答案 1 :(得分:1)

Your regex包含 - 正如您已经提到的 - 一个贪婪的子模式,它占用了整个字符串,正弦(\S*\s*){2}可以匹配一个空字符串,它匹配输入字符串末尾的空位置。

延迟点匹配(将.*更改为.*?won't do the whole job,因为捕获组已量化,Matcher.group(1)将设置为最后捕获的非空白可选的空格。 您需要在量化组周围设置捕获组。

由于您最有可能使用Matcher#matches,因此可以使用

String str = "The man  is very   tall.";
Pattern ptrn = Pattern.compile("(.*?)((?:\\S*\\s*){2})"); // no need for `^`/`$` with matches()
Matcher matcher = ptrn.matcher(str);
if (matcher.matches()) {                  // Group 2 contains the last 2 "words"
    System.out.println(matcher.group(2)); // => very   tall.
}

请参阅IDEONE demo