[英]Regex in Java: Capture last {n} words
嗨,我正在嘗試用Java做正則表達式,我需要捕獲最后{n}個單詞。 (單詞之間可能有可變數量的空格)。 要求是必須在正則表達式中完成。 所以例如
The man is very tall.
對於n = 2,我需要捕獲
very tall.
所以我嘗試了
(\S*\s*){2}$
但這在Java中不匹配,因為必須首先使用初始單詞。 所以我嘗試了
^(.*)(\S*\s*){2}$
但是。*會占用所有內容,最后兩個單詞將被忽略。 我也嘗試過
^\S?\s?(\S*\s*){2}$
有人知道解決這個問題的方法嗎?
您的初次嘗試幾乎快到了。
只需將+
更改為*
。
加號表示至少一個字符,因為匹配失敗沒有空格。
另一方面,星號表示從零到更多,因此它將起作用。
在此處實時查看: (?:\\S*\\s*){2}$
使用replaceAll
方法,您可以嘗試以下正則表達式: ((?:\\\\S*\\\\s*){2}$)|.
如前所述,您的正則表達式包含一個貪婪的子模式,該模式會占用整個字符串,正弦(\\S*\\s*){2}
可以匹配一個空字符串,它匹配輸入字符串末尾的一個空位置。
由於對捕獲組進行了量化,因此惰性點匹配(將.*
更改為.*?
) 無法完成全部工作 ,並且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.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.