0

使用(jdk 1.6),应用于主题字符串java.util.regex的正则表达式仅捕获而不捕获(模式),因为它应该,给定以下代码:201210(\d{5,5})Test20121000002Testgroup(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 的正则表达式库真的很烂?

4

5 回答 5

1

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

它应该是for(int i = 1; i<=m1.groupCount(); i++)

于 2012-10-20T15:45:06.760 回答
1

换行

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

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

它现在可以作为一种魅力!

于 2012-10-20T15:43:42.160 回答
0

java.util.regex.MatchResult.groupCount

按照惯例,零组表示整个模式。它不包括在此计数中。

所以遍历groupCount() + 1.

于 2012-10-20T15:45:23.437 回答
0

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

好吧,我可以说我也没有阅读手册,但是如果您这样做,则说明Matcher.groupCount()

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

于 2012-10-20T15:37:01.287 回答
0
for (int i = 1; i <= m1.groupCount(); i++) { 
                   ↑
              your problem
于 2012-10-20T15:39:21.957 回答