我有这个输入字符串(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
仍然错过了一场比赛。
任何人都可以帮我提供正则表达式。谢谢
答案 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;
}