java - 为什么我在java正则表达式中只找到一组

标签 java regex

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

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

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

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

enter image description here

基于javadoc,

Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to 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 通过特殊的组构造 (?<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

关于java - 为什么我在java正则表达式中只找到一组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48108940/

相关文章:

Java TimerTask <identifier> 预期

java.lang.IllegalStateException : Neither BindingResult nor plain target object for bean name 'subscription' available as request attribute

javascript - 正则表达式模式不按预期工作

php - is_numeric、intval、ctype_digit .. 你可以依赖它们吗?

python - 如何替换 Python 中第一次出现的正则表达式?

Java 协方差

java - 具有不同 xml 名称的相同响应对象

java - Java 中类型删除后具有相同签名的静态方法

php - 如何使用 php preg_replace 替换 HTML 标签

c - 当我使用 posix 正则表达式时,regcomp 传递 regex_t* 引发 SIGSEGV