2015-04-16 124 views
-2

首先讓,我警告你,我是新來的正則表達式,而我的英語也不好......捕捉重複的組

我試圖捕捉重複的組,就像從http可選的頭協議。

我需要的是給定一個字符串獲取所有頭(無或多個):

GET /RESOURCE/RES1 H1:value H2:value H3:value 

所以我已經試過是一樣的東西:

GET /RESOURCE/([^/\s]*)(\s[a-zA-Z:/|-]*)+ 

但所有我得到的是:

Group 1 = LS 
Group 2 = H3:value 

我在做什麼錯?

+0

你怎麼想你的結果是?所有的頭文件應該分開嗎? –

回答

0

您可以添加包裝最後一個捕獲組和量詞+的另一個捕獲組。事實上,你可以使當前捕獲組非捕獲:

GET /RESOURCE/([^/\s]*)((?:\s[a-zA-Z:/|-]*)+) 

現在,捕獲組2會給你以下結果:

H1:value H2:value H3:value 

你可以從它通過對空間拆分得到個人頭,然後冒號。

+0

我試過這個解決方案。不過,我想知道我是否可以獲得可變數量的團體。 但我會牢記這一點。謝謝你。 –

1

您可以使用\G定位點做類似的事情,但不能單獨捕獲重複模式。

(?:\G(?!\A)|GET /RESOURCE/)(\S+)(?: |$) 

例子:

String s = "GET /RESOURCE/RES1 H1:value H2:value H3:value"; 
Pattern p = Pattern.compile("(?:\\G(?!\\A)|GET /RESOURCE/)(\\S+)(?: |$)"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 

輸出

RES1 
H1:value 
H2:value 
H3:value 
+0

我會看看你的解決方案...但首先我需要學習REGEX多一點... –