您好我正在尝试在java中执行正则表达式,我需要捕获最后的{n}个单词。 (单词之间可能有一些变量的空格)。要求是必须在正则表达式中完成。 所以例如在
The man is very tall.
对于n = 2,我需要捕获
very tall.
所以我试过
(\S*\s*){2}$
但这在java中不匹配,因为必须首先使用初始单词。所以我试过
^(.*)(\S*\s*){2}$
但是。*消耗一切,最后两个字被忽略。 我也试过
^\S?\s?(\S*\s*){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