2011-03-26 66 views
3

我嘗試編寫一個正則表達式以在Java程序中使用,該程序將識別可能出現在輸入中的模式未知次數。我傻傻的小例子:正則表達式捕獲未知數量的重複組

String patString = "(?:.*(h.t).*)*";

然後我嘗試從線路接入比賽像「小屋是熱的」通過matcher.group(I)循環。它只記得最後一場比賽(在這種情況下,「熱」),因爲只有一個捕獲組 - 我猜matcher.group(1)的內容會在捕獲組被重用時被覆蓋。我想要的是某種包含的數組,其中包含「hut」和「hot」。

有沒有更好的方法來做到這一點? FWIW,我真正想要做的是在信號詞後面加上所有(可能是多個詞)專有名詞,其中可能有其他詞和標點符號。所以,如果「看到」是信號,我們有「我看到鮑勃與約翰史密斯和他的妻子瑪格麗特,」我想要「鮑勃」,「約翰史密斯」,「瑪格麗特」}。

+0

如何只使用'h.t'作爲模式字符串? – vbence 2011-03-26 19:43:27

+0

如果我只使用'(h.t)'(使用parens使它成爲一個捕獲組),那麼我只得到第一個匹配項,而不是最後一個匹配項。 (這是你的意思嗎?) – umbraphile 2011-03-26 19:46:18

+0

我在這裏問自己這裏:http://stackoverflow.com/questions/5018487/regular-expression-with-variable-number-of-groups – aioobe 2011-03-26 19:47:58

回答

6

(類似的問題:Regular expression with variable number of groups?

這是不可能的。你最好的選擇是使用h.t,並使用

while (matcher.find()) { 
    ... 
    ... matcher.group(1); ... 
    ... 
} 

特徵does exist in .NET,但如上所述,有在Java中沒有對應。

+0

好的 - 我用帽子/小屋/熱示例試過了,這很好 - 只需要將它翻譯成我更復雜的現實世界問題!謝謝。 – umbraphile 2011-03-26 20:12:36