簡體   English   中英

Java正則表達式:捕獲最后{n}個單詞

[英]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.
}

IDEONE演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM