繁体   English   中英

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

[英]Regex fails to capture all groups

使用java.util.regex (jdk 1.6),应用于主题字符串20121000002Test的正则表达式201210(\\d{5,5})Test仅捕获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));            
    }
}

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

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

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

改变线

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

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

它现在作为一个魅力!

m1.groupCount()返回捕获组的数量,即。 在你的第一个案例中为1,所以你不会在这个循环中输入for(int i = 1; i<m1.groupCount(); i++)

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

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

好吧,我可以说我也没有看过手册,但如果你这样做,就说Matcher.groupCount()

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

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

来自java.util.regex.MatchResult.groupCount

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

因此,遍历groupCount() + 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM