2012-03-09 111 views
3

我有一個URL模式,它需要包含APPLES或ORANGES,沒有其他值。或者,它也可以具有查詢參數。我已經嘗試過許多RegEx模式,但我無法獲得尊重嚴格匹配的模式。部分URL的RegEx模式(在路徑中開啓兩個值)

網址取樣

http://www.website.com/en/pages/APPLES 
http://www.website.com/en/pages/APPLES?k=v 
http://www.website.com/en/pages/ORANGES?k=v&k2=v2 
http://www.website.com/en/pages/ORANGES 

http://www.website.com/en/pages/APPLES???k=v 
http://www.website.com/en/pages/APPLES?k=v=v 
http://www.website.com/en/pages/APPLESORANGES 
http://www.website.com/en/pages/1APPLES 
http://www.website.com/en/APPLES 

種嘗試正則表達式模式(好,至少最好嘗試)

(http://*.*.website*.*.com/*.*/pages(/APPLES)|(/ORANGES)[\?]*.*) 
(http://*.*.website*.*.com/*.*/pages(/APPLES|/ORANGES)[\?]*.*) 

如果你很好奇,我故意要允許任何子域名,「網站」(針對不同的環境)後的後綴,以及.com /和/ pages之間的任何路徑,因此使用在很多地方。

什麼是最好的方法來實現這一目標?

**編輯:最後的答案**

我最後的答案是從mathematical.coffee和fardjad合併。

^https?://.*\.website\b.*\.com/.*/pages/(APPLES\b|ORANGES\b)((\?\w+=\w+)(&?\w+=\w+)*)?$ 

單限制我發現的是,它不會允許少數有效字符的查詢字符串參數鍵值對(見:http://en.wikipedia.org/wiki/Query_string#Structure)(〜_-%+)。這對我來說不是問題,因爲我匹配從.NET的Uri類返回的字符串,所以我知道URL是整體良構的。

回答

3

我覺得*.*應該是.*

http://.*\.website\b.*\.com/.*/pages/PAGE[12](\?[^=]+=[^&=]+(&[^=]+=[^=&]+)*)? 

說明:

http://  # just http:// 
.*\.   # any thing, just make sure it's followed by '.' 
website\b # website, the whole word 
.*\.com  # anything between website and .com 
/.*/pages/ # anything between the .com and the pages 
PAGE[12]  # PAGE1 or PAGE2 
(\?   # opening bracket and '?' (query string) 
[^=]+  # the key: i've said it can't include = 
=   # = 
[^=&]+  # the value: i've said it can't include = or & 
(&   # opening bracket and '&' for next part of query string 
[^=]+=[^=&]+ # key=value pair, same regex as before 
)*   # 0 or more of these (the &key=value) 
)?   # the entire query string is optional. 

注 - 通常有分析查詢字符串與正則表達式,並確保它是一個語法上有效的正則表達式的問題。

例如,在上面提供的正則表達式中,我已經說過& key = value中的值不能包含&符號。但它可能是一個逃脫的實體,如&,其中合法。

當你嘗試用正則表達式解析語法時,你總會遇到這樣的問題。這是一個你必須承擔的風險。

另外,我確定有一個C#模塊來解析URL(許多其他語言都有這些),他們會爲您處理所有這些特殊情況。

+0

感謝您的快速答覆!真的很感謝你的模式的詳細分解:)我使用PAGE1和PAGE2作爲佔位符,實際上我有兩個不同的單詞(例如APPLE,ORANGE);對不起,在這一點上不清楚。我更新了我的問題以反映這一點。我嘗試修改你的模式如下,但我錯過了一些東西,因爲它不正確匹配。 '''code'http://.* \ .website \ b。* \ .com /.*/ pages/APPLES \ b | ORANGES \ b(\?[^ =] + = [^&=] +( &[^ =] + = [^ =&] +)*)? – 2012-03-09 05:03:07

+0

你必須在變化周圍添加括號:'(APPLES | ORANGES)'。 – 2012-03-09 05:10:05

+0

真棒,得到它所有的工作。您的模式沒有過濾掉所有我的不良網址,所以我混合並匹配了您的模式片段和@fardjad中的一個,直到所有測試通過。只是我不太擔心的一個小問題是,在查詢參數中我不能有幾個允許的字符,但是因爲我匹配從.NET URI返回的字符串,所以應該沒問題。最終模式:'code'^https?://.* \ .website \ b。* \ .com /.*/ pages /(APPLES \ b | ORANGES \ b)((\?\ w + = \ w +)( &?\ w + = \ w +)*)?$ – 2012-03-09 05:56:19

1

嘗試this

^https?://(www\.)?\w+[^/]+(/\w+(?=/)){2}/(PAGE1|PAGE2)((\?\w+=\w+)(&?\w+=\w+)*)?$