为什么我在java正则表达式

时间:2018-01-05 07:20:08

标签: java regex

我正在编写一个关于正则表达式的非常简单的示例代码,但无法使用group

正则表达式为:rowspan=([\\d]+)

输入字符串为:<td rowspan=66>x.x.x</td>

我在在线正则表达式引擎上测试它,显然可以捕获组66,请参阅下面的快照:

enter image description here

基于javadoc,

  

组零表示整个模式,因此表达式m.group(0)为   相当于m.group()。

所以我认为应该有两个小组,小组0应该是rowspan=66,小组1应该是66。但是,我从下面的代码中得到的只是前者。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String args[]){
        String input = "<td rowspan=66>x.x.x</td> ";
        String regex = "rowspan=([\\d]+)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        if(matcher.find()){
            for(int i = 0; i < matcher.groupCount(); i++){
                System.out.println(matcher.group(i));
            }
        }
    }

}

输出结果为:

rowspan=66

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我认为代码的问题与理解Matcher#groupCount方法的作用有关。来自Javadoc

  

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

换句话说,假设您有一个捕获组,您的for循环只会迭代一次。但是你打印的是第一组,这是整个模式:

for (int i=0; i < matcher.groupCount(); i++) {
    System.out.println(matcher.group(i));
}

相反,只需在匹配时进行迭代,然后访问所需的组。我没有看到对捕获组进行硬编码的问题很多,因为如果发生了匹配,那么根据定义,匹配中的捕获组也应该存在。

String input = "<td rowspan=66>x.x.x</td> ";
String regex = "rowspan=(\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
    System.out.println(matcher.group(0));
    System.out.println(matcher.group(1));
}

Demo

注意:你的模式看起来也有点奇怪。如果您想通过\\d匹配一个数字,那么您也不必将其添加到字符类中。因此,我在代码中使用了模式rowspan=(\\d+)

答案 1 :(得分:1)

我一直是正则表达式的命名组的粉丝,Java通过特殊的组构造(?<name>)支持这一点。这样可以更轻松地检索正确的组,如果稍后在表达式中添加另一个组,则不会搞砸。它也有副作用,它消除了对matcher.groupCount()的任何混淆。

将正则表达式更改为rowspan=(?<rowspan>[\\d]+)

您的代码:

public class Test {

    public static void main(String args[]){
        String input = "<td rowspan=66>x.x.x</td> ";
        String regex = "rowspan=(?<rowspan>[\\d]+)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        if(matcher.find()){
            System.out.println("Entire match: " + matcher.group());
            System.out.println("Row span: " + matcher.group("rowspan"));
        }
    }

}

你会得到:

Entire match: rowspan=66
Row span: 66

答案 2 :(得分:0)

尝试

for(int i = 0; i <= matcher.groupCount(); i++){
    System.out.println(matcher.group(i));
}

matcher.groupCount()1,因此如果您使用<,则只会对索引0进行迭代。