正则表达式无法捕获所有组

时间:2012-10-20 15:31:27

标签: java javascript regex capturing-group

使用java.util.regex(jdk 1.6),应用于主题字符串201210(\d{5,5})Test的正则表达式20121000002Test仅捕获group(0)并且不捕获group(1)(模式00002),如下所示:

Pattern p1 = Pattern.compile("201210(\\d{5,5})Test");
Matcher m1 = p1.matcher("20121000002Test");

if(m1.find()){

    for(int i = 1; i<m1.groupCount(); i++){         
    System.out.println("number = "+m1.group(i));            
    }
}

奇怪的是,应用于主题字符串201210(\d{5,5})Test(\d{1,10})的另一个类似的正则表达式(如20121000002Test0000000099)会捕获组0和1,但不会捕获组2。

相反,通过使用JavaScript的RegExp对象,应用于完全相同的主题字符串的完全相同的正则表达式捕获所有组,正如人们所期望的那样。我使用这些在线测试人员自行检查并重新检查了这个事实:

我在这里做错了吗?或者Java的正则表达式库真的很糟糕吗?

5 个答案:

答案 0 :(得分:1)

更改行

for(int i = 1; i<m1.groupCount(); i++){     

for(int i = 1; i<=m1.groupCount(); i++){      //NOTE THE = ADDED HERE    

它现在充当了魅力!

答案 1 :(得分:1)

m1.groupCount()返回捕获组的数量,即。在第一种情况下为1,因此您不会进入此循环for(int i = 1; i<m1.groupCount(); i++)

应为for(int i = 1; i<=m1.groupCount(); i++)

答案 2 :(得分:0)

  

正则表达式“201210(\ d {5,5})测试”应用于主题字符串“20121000002Test”仅捕获组(0)并且不捕获组(1)

嗯,我可以说我没有读过这本手册,但是如果你这样做的话就说Matcher.groupCount()

  

返回此匹配器模式中的捕获组数。   组0表示按惯例的整个模式。它不包含在此计数中。

答案 3 :(得分:0)

for (int i = 1; i <= m1.groupCount(); i++) { 
                   ↑
              your problem

答案 4 :(得分:0)

来自java.util.regex.MatchResult.groupCount

  

组0表示按惯例的整个模式。它不包含在此计数中。

所以迭代groupCount() + 1