4

我有以下正则表达式模式:^(\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;
}
4

1 回答 1

5

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

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

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

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

因此,在第一组中总会有第一个找到的数字。对于其他两组,您正在做一些特别的事情:您正在重复捕获组

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

解决方案:

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

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

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

于 2013-01-21T09:31:34.690 回答