【问题标题】:Java RegEx Matcher.groupCount returns 0Java RegEx Matcher.groupCount 返回 0
【发布时间】:2012-09-06 23:54:35
【问题描述】:

我知道有人问过这个问题,但我无法解决它

对于带有正文的书籍对象(西班牙语):"quiero mas dinero"(实际上更长一点)

我的Matcher 不断返回 0:

    String s="mas"; // this is for testing, comes from a List<String>
    int hit=0;
    Pattern p=Pattern.compile(s,Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(mybooks.get(i).getBody());
    m.find();
    System.out.println(s+"  "+m.groupCount()+"  " +mybooks.get(i).getBody());
    hit+=m.groupCount();

我在控制台上不断收到"mas 0 quiero mas dinero"。为什么哦为什么?

【问题讨论】:

  • 您的模式中没有捕获组,因此.groupCount() 返回零。请注意,这返回找到了多少匹配项。
  • 我怎样才能在不循环的情况下找到字符串中“mas”(或任何其他)单词的数量?
  • 我不知道标准 Java 中有什么可以让你这样做。循环有什么问题? int count = 0; for (; m.find(); count++); 应该给你你想要的。
  • 没什么,我只是觉得有一种方法(仍在学习 java),它总是更容易阅读
  • 从 Java 8 开始,您可能会发现使用 Pattern.splitAsStream().count() 很有用。

标签: java regex matcher


【解决方案1】:

来自Matcher.groupCount()的javadoc:

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

如果您检查来自m.find() 的返回值,它将返回true,而m.group() 返回mas,因此匹配器确实找到了匹配项。

如果您要做的是计算smybooks.get(i).getBody() 中的出现次数,您可以这样做:

String s="mas"; // this is for testing, comes from a List<String>
int hit=0;
Pattern p=Pattern.compile(s,Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(mybooks.get(i).getBody());
while (m.find()) {
    hit++;
}

【讨论】:

  • 感谢 Keppil,这很好,我知道这个解决方案,我只是认为有一个方法可以做到这一点(没有循环)。必须等待几分钟才能标记为正确(stackoverflow 的事情)
  • @dhomes 这个答案:stackoverflow.com/a/23244470/2818583 更清晰
【解决方案2】:

我怎样才能在不循环的情况下找到字符串中“mas”(或任何其他)单词的数量?

您可以在 Apache Commons 中使用 StringUtils

int countMatches = StringUtils.countMatches("quiero mas dinero...", "mas");

【讨论】:

  • 会的!尽管他为我清理了一些核心 Java 概念,但还是要感谢 Keppil
【解决方案3】:

您可以在正则表达式中添加括号,然后在您的示例中为“(mas)”。

【讨论】:

    【解决方案4】:

    您可以在正则表达式中添加括号,然后在您的示例中为“(mas)”。

    这种方式不适合这个任务。它显示捕获组的数量包含 Matcher m 的结果。 在这种情况下,即使对于像“mas mas”这样的输入文本的模式是“(mas)”,m.groupcount() 也会显示 1 - 一个且只有两个匹配项的组。

    所以第一个响应是正确的,并且是唯一可能用于匹配计数的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2018-05-31
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多