2016-06-10 54 views
1

我正在使用Java的正则表达式库。我想根据以下格式验证字符串:java正则表达式 - 捕获重复组

31,5,46,7,86(...) 

数量的数量是未知的。我想确保该字符串中至少有一个数字,并且每两个数字之间用逗号分隔。我也想从字符串中获取数字。

注:这只是一个简单的例子,string.split不会解决我的实际问题)

我写了下面的正则表达式:

({[0-9]++)((?:,[0-9]++)*+) 

验证部分作品。然而,当我尝试提取数字,我得到2组:

Group1: 31 
Group2: ,5,46,7,86 

regex101版本:https://regex101.com/r/xJ5oQ6/3

有没有一种方法,我可以分别得到各是多少?即结束收集:

[31, 5, 46, 7, 86] 

在此先感谢。

+0

你能得到它的递归? – morels

回答

1

Java不允许你访问一个重复捕获组的个人比赛。欲了解更多信息,请看这个问题:Regular Expression - Capturing all repeating groups

Tim Pietzcker提供的代码也可以帮助你。如果返工有点,并添加一个特殊的情况下将第一个数字就可以使用这样的事情:

String target = "31,5,46,7,86"; 

Pattern compileFirst = Pattern.compile("(?<number>[0-9]+)(,([0-9])+)*"); 
Pattern compileFollowing = Pattern.compile(",(?<number>[0-9]+)"); 

Matcher matcherFirst = compileFirst.matcher(target); 
Matcher matcherFollowing = compileFollowing.matcher(target); 

System.out.println("matches: " + matcherFirst.matches()); 
System.out.println("first: " + matcherFirst.group("number")); 

int start = 0; 
while (matcherFollowing.find(start)) { 
    String group = matcherFollowing.group("number"); 

    System.out.println("following: " + start + " - " + group); 
    start = matcherFollowing.end(); 
} 

此输出:

matches: true 
first: 31 
following: 0 - 5 
following: 4 - 46 
following: 7 - 7 
following: 9 - 86 
0

这可能会为你工作:

/(?=[0-9,]+$)((?<=,|^)[0-9]{1,2})(?=,|$)/g 

上述捕获一个或两个数字,然后输入,或结束。

请注意,我使用了g lobal修饰符。

Try it online

+0

现在捕获工作正常,但验证不是:我试图在中间添加一个字母,而不是'不匹配'[我得到这个](https://regex101.com/r/xJ5oQ6/5) 。 你的建议是最接近我想要的东西,但任何想法如何调整它? –

+0

@RoyMillo我更新了正则表达式,但是你想要的是不可能放入一个PCRE正则表达式,因为动态长度lookbehinds不被支持。我不知道Java正在使用哪种正则表达式。 – andlrc

+0

然而,你的验证正则表达式可能看起来像这样:'/^[0-9,] + $ /' – andlrc