【问题标题】:Why do I find only one group in java regular expression [duplicate]为什么我在java正则表达式中只找到一组[重复]
【发布时间】:2018-06-14 23:46:42
【问题描述】:

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

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

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

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

基于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

提前感谢您的帮助。

【问题讨论】:

标签: java regex


【解决方案1】:

我一直是正则表达式命名组的粉丝,Java 通过特殊的组构造 (?&lt;name&gt;) 支持这一点。这使得检索正确的组更容易,并且如果您稍后在表达式的前面添加另一个组,您也不会搞砸。它还有一个副作用是它消除了关于matcher.groupCount() 的任何混淆。

将您的正则表达式更改为rowspan=(?&lt;rowspan&gt;[\\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】:

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

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

换句话说,假设您有一个捕获组,您的 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+)

【讨论】:

    【解决方案3】:

    试试

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

    matcher.groupCount()1,所以如果你使用&lt;,你将只迭代索引0

    【讨论】:

    • 嗯,有帮助。这里的 groupCount 真的很混乱。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2023-03-11
    相关资源
    最近更新 更多