【问题标题】:How to get all the found groups using Pattern and Matcher如何使用 Pattern 和 Matcher 获取所有找到的组
【发布时间】:2013-01-21 09:13:58
【问题描述】:

我有以下正则表达式模式:^(\d+)(;(\d+))*$。我想获取该正则表达式中的组数以及每个组的值。

我尝试使用 groupCount 和 group 但得到以下结果:

Input: "1"
Groups: 3
"1", "1", null, null 
Input: "1;2"
Groups: 3
"1;2", "1", ";2", "2"
Input: "1;2;3"
Groups: 3
"1;2;3", "1", ";3", "3"
Input: "1;2;3;4"
Groups: 3
"1;2;3;4", "1", ";4", "4"

我期待第一个 "1" 从 groupCount 获得 1。对于最后一个 "1;2;3;4",我希望从 groupCount 中得到 7。

Matcher 上是否有任何方法可以返回我所期望的?

编辑:添加生成上述输出的代码

String input = "1";
Pattern pattern = Pattern.compile("^(\\d+)(;(\\d+))*$");
for (int i = 2; i < 6; ++i) {
    Matcher matcher = pattern.matcher(input);
    matcher.matches();
    System.out.println("Input: \"" + input + "\"\nGroups: " + matcher.groupCount());
    for (int group = 0; group <= matcher.groupCount(); ++group) {
        System.out.print("\"" + matcher.group(group) + "\", ");
    }
    System.out.println();
    input += ";" + i;
}

【问题讨论】:

  • 我们可以看看你的代码吗?
  • 我添加了用于测试 groupCount() 和 group() 行为的代码,因为我注意到它没有达到我的预期。

标签: java regex


【解决方案1】:

很抱歉,您对群组有误解。

您使用正则表达式定义组数。它不依赖于字符串。在您的正则表达式中,您定义了 3 个组:

 ^(\\d+)(;(\\d+))*$
  1     2 3

组由左括号编号。所以你的正则表达式总是有 3 个组。如果他们匹配的东西是完全不同的东西。

因此,在第一组中总会有第一个找到的号码。对于其他两组,您正在做一些特别的事情:您是 repeating a capturing group

由于您匹配的以下数字都存储在第 3 组中,因此您只会在最终结果中找到最后一个。在 .net 中,您可以读出所有匹配项,但我认为在 Java 中是不可能的。

解决方案:

使用正则表达式验证字符串

^\\d+(;\\d+)*$

如果格式没问题,则通过在“;”上进行拆分来获取数字

【讨论】:

  • 但我想要的是捕获可变大小输入的出现次数。有什么方法可以获取这些信息?
  • 在分号处分割字符串input可以使用input.split(";")来完成。
  • 不要忘记 split(",", ) 参数,如果以这种方式计算会产生巨大的差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多