2011-03-26 68 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