2016-06-10 57 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