【问题标题】:Why do I'm getting these results from my regex matcher?为什么我从我的正则表达式匹配器中得到这些结果?
【发布时间】:2015-08-22 19:14:53
【问题描述】:

我有以下代码:

    String content = "title = 123";
    Pattern p = Pattern.compile("(title)");
    Matcher m = p.matcher(content);

    int i = 1;
    while (m.find()) {
        System.out.println("groupCount() = " + m.groupCount());
        System.out.println("i = " + i++ + "     found: " + m.group(0));
        System.out.println("i = " + i++ + "     found: " + m.group(1));
    }

输出为:

groupCount() = 1
i = 1   found: title
i = 2   found: title

谁能告诉我为什么我有 1 组计数,以及我是否在 group(0)group(1) 中得到正确的值?

group(0)group(1) 之间有什么区别吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    文档中的种子:
    groupCount()

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


    group(int)

    捕获组的索引从左到右,从一个开始。组 0 表示整个模式,因此表达式 m.group(0) 等价于 m.group()。

    所以 group 0 是要匹配的整个字符串。并且您有一个包含整个字符串的捕获组。所以技术上是2 组。

    0 是默认值
    1 是您定义的

    定义的组索引从1开始。

    【讨论】:

    • 所以组 0 对我来说是无关紧要的?
    • 是的。您只需要使用组1 作为计数开始表单10 是默认的整个匹配。
    • 在那种情况下,我总是会多加 1 个组?
    • 是的,您将永远再加上 1 个 group 。但是这个0(默认组)不包括在groupCount()
    【解决方案2】:

    为什么我有 1 组计数?

    Matcher specs:

    groupCount() - 返回此匹配器模式中的捕获组数。

    您只有 1 个捕获组:(title)

    group(0) 和 group(1) 有什么区别吗?

    group(0) 是整个匹配(即与整个模式匹配的字符串),group(1) 只是用第一个编号的捕获组捕获的子字符串。在您的特定情况下,group(0)group(1) 是相等的,因为您将捕获组设置为整个模式。因此,整个匹配(group(0))和捕获的子字符串(group(1))重合。

    最佳实践不要围绕整个模式使用捕获组,因为您始终可以使用 group(0) 访问它。

    【讨论】:

      【解决方案3】:

      group 0 是正在使用的整个字符串。由于您正在捕获所有内容,group 0group 1(代表第一个捕获/匹配的组)将是相同的。如果你有这样的事情:

      Pattern p = Pattern.compile("(title) = 123"); 那么您将能够找到第 0 组和第 1 组之间的区别。

      注意:group()group(0) 相同

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 2010-11-05
        • 2017-08-22
        相关资源
        最近更新 更多