java.util.regex.Matcher中的group()?

时间:2015-06-04 09:45:35

标签: java regex

String pattern = "(.*)(\\d+)";
while(m.find()){
        System.out.println(m.group(1));
        System.out.println(m.group(2));
     } 

输入:

This order was placed for QT3000! OK?

输出:

This order was placed for QT300
0

为什么在第一行输出中它不包括第三行,即QT3000? 为什么第二行输出不打印3000?

3 个答案:

答案 0 :(得分:1)

这是因为.*是贪婪的,只为\d组留下一个\\d+。让它不贪婪.*?,你会得到你想要的。

.*将与最后一个字符匹配,然后开始回溯,直到找到\d。所以当它从03000转发时,它会停在那里。

.*?将在\d的第一个实例停止,即3。因此,您将在第二组中获得3000

答案 1 :(得分:1)

这是因为.*是贪婪的,它尽可能匹配所有角色。所以.*匹配所有字符到最后一个然后它回溯直到它找到一个数字,因为在正则表达式中给出了\d+\d+匹配一个或多个数字。所以它不会回溯到下一个数字,因为匹配至少一位数的条件已经完成。解决方法是,您需要将.*设为非贪婪"(.*?)(\\d+)"

答案 2 :(得分:0)

Vks和Raj已经非常详细地解释了你的问题,但没有例子。 所以我发现了一篇关于Oracle的文章,它提供了一个清晰的解释,并附有许多例子希望它可以帮助 Pattern quantifier explanation