2012-10-12 84 views
4

我要尋找一個正則表達式匹配以下4個例(抓住ID的,所以我可以重新寫入的網址)正則表達式可選組

http://localhost/gallery/test-name/123456 
http://localhost/gallery/test-name/123456/ 
http://localhost/gallery/test-name/123456/video-name/159 
http://localhost/gallery/test-name/123456/video-name/159/ 

當前正則表達式是下面的,但其不斂IDS正確地在所有情況下。那裏的任何專家都知道我做錯了什麼?

^(.*)/gallery/(.*)/([0-9]{1,15})(/)?((.*)/([0-9]{1,15})(/)?)? 
+0

哪種編程語言? – Gerrat

+0

你爲什麼不把字符串分割成'/'? – halex

回答

3

.*(你的第二次使用它)是貪婪的。所以它會消耗一切,直到你的最後一個ID。這就是爲什麼第一個ID丟失,如果你有兩個。讓它ungreedy代替:

^(.*)/gallery/(.*?)/([0-9]{1,15})(/)?((.*?)/([0-9]{1,15})(/)?)? 

我還添加了?最後.*如果你想更多的參數添加到這一點。但是,簡單地分割字符串/可能會更簡單。

+0

謝謝!這工作。 –

1

僅通過改變第二.*在你的正則表達式來.*?,你應該讓你期待你的例子字符串捕獲組:

^(.*)/gallery/(.*?)/([0-9]{1,15})(/)?((.*)/([0-9]{1,15})(/)?)? 

例子:http://www.rubular.com/r/CdBgdA1PlY

1

我知道這是不是正是你想要,但你有沒有考慮一些沿線:

string l_url = "http://localhost/gallery/test-name/123456/video-name/159"; 
string l_id = l_url.Split('/')[5]; 

因爲你沒有指定一種語言,上面是用C#編寫的,但可以很容易地轉換成任何其他語言。