如何分组正则表达式

时间:2009-08-24 09:19:18

标签: java regex

我有这个输入字符串(oid):1.2.3.4.5.66.77.88.99.10.52

我希望将每个数字分组为3,这样

第1组:1.2.3

第2组:4.5.66

第3组:77.88.99

第4组:10.52

取决于输入,它应该是非常动态的。如果它有30个数字意味着它将返回10个组。

我已经使用此正则表达式进行了测试:(\ d +。\ d +。\ d +)

但结果是这个

比赛1:1.2.3

Subgroups:

1: 1.2.3

比赛2:4.5.66

Subgroups:

1: 4.5.66

比赛3:77.88.99

Subgroups:

1: 77.88.99

仍然错过了一场比赛。

任何人都可以帮我提供正则表达式。谢谢

4 个答案:

答案 0 :(得分:1)

如果您想匹配最多三位数,请尝试:

((?:\d+\.?){1,3})

{1,3}部分匹配前一项的1-3(这是一个或多个数字后跟文字.。请注意,点会被转义,因此它与任何字符都不匹配

修改

进一步说明:(?: )部分是不能用于反向引用的分组(往往更快),有关详细信息,请参阅第4.3节here。当然,如果您愿意,也可以使用((\d+\.?){1,3})。有关{1,3}的详细信息,请参阅“限制重复”下的here

编辑(2)

修正了dtmunir指出的错误。一种更明确的替代方式(并且在早期组的末尾没有捕获额外的“。”):

((?:\d+\.){0,2}\d+)

答案 1 :(得分:1)

\d+(?:\.\d+){0,2}

这与Al的最终正则表达式基本相同 - ((?:\d+\.){0,2}\d+) - 但我认为这样更清晰。并且没有必要在整个正则表达式周围加上括号。假设您使用Matcher.find()来获取匹配项,则可以使用group()group(0)代替group(1)来检索匹配的文本。

答案 2 :(得分:0)

Al不会捕获52.但事实上这个将会:

((?:?\ d + \){1,3})

唯一的变化就是在之后添加问号。 这允许它接受最后一个数字而没有一个句点

说明(编辑):

\ d +你可以想象捕获连续的数字。

\。捕获一段时间

\。?捕获一个句点,但允许内部组在末尾不需要句号

(?:\ d + \。?)定义“一个组”,在您的情况下,您想要成为3个数字。

{1,3}设定限制。它需要至少1个内组和最多3个内​​组。这些群体可能会或可能不会以句号结束。

答案 3 :(得分:0)

这是我没有正则表达式的奇怪代码: - )

public static String[] getTokens(String s) {

    String[] splitted = s.split("\\.");

    //Personally I hate Double.valueOf but I don't know how to avoid it
    String[] result = new String[Double.valueOf(Math.ceil(Double.valueOf(splitted.length) / 3)).intValue()];

    for (int i = 0, j = 0; j < splitted.length; i++, j+=3) {

        //Weird concat
        result[i] = splitted[j] + ( j+1 < splitted.length ? "." + splitted[j+1] : "" ) + ( j+2 < splitted.length ? "." + splitted[j+2] : "" );

    }
    return result;
}