2017-10-29 112 views
0

重複我具有以下,可以是捕獲正則表達式中的URL

/它/ XYZ /測試/ PARAM + 1/PARAM-2/1234/gfd4

基本上兩個字母的部分URL斜線之間串在開始時斜線另一個未知的字符串,然後斜線之間的一系列可重複的字符串 我需要捕獲每個字符串(我知道與/分隔符分裂將罰款,但我有興趣知道如何可以提取與正則表達式)。我來到了第一本:

^\/([a-zA-Z]{2})\/([a-zA-Z]{1,10})(\/[a-zA-Z1-9\+\-]+) 

,但它只能捕捉

組1:它 組2:XYZ 第3組:/測試

,當然它忽略字符串的其餘部分。

如果我在最後加*號,只抓住了最後一句:

^\/([a-zA-Z]{2})\/([a-zA-Z]{1,10})(\/[a-zA-Z1-9\+\-]+)* 

組1:它 組2:XYZ 第3組:/ gfd4

所以,我明顯缺少一些基礎知識,所以除了正確的正則表達式之外,我想解釋一下。

我標記爲Java,因爲解析正則表達式的引擎是JDK 7.我知道每個引擎可能有差異。

回答

0

由於mentioned here,這種預期:

有了一個組中的模式,你只能得到該組中的一個確切的結果。
如果您的捕獲組按照模式重複(您在周圍的非捕獲組上使用了+量詞),則僅存儲與其匹配的最後一個值。

我寧願捕捉第3組的字符串的其餘部分((\/.*$),如in this demo),然後使用拆分圍繞「/」。或在字符串的其餘部分應用yhat圖案:

Pattern p = Pattern.compile("(\/[a-zA-Z1-9\+\-]+)"); 
Matcher m = p.matcher(str); 
while (m.find()) { 
    String place = m.group(1); 
    ... 
}