2008-11-27 52 views
13

我需要測試一個URL,它結束與.asp正則表達式匹配的字符串(1+字符)不.EXT(擴展)結束

所以testtest.htmltest.aspx應匹配,但test.asp不應該匹配。

通常你會測試是否網址確實最終以.asp,並否認它在代碼中使用NOT運算符匹配的事實:

if(!regex.IsMatch(url)) { // Do something } 

在這種情況下,正則表達式將\.asp$但在這種情況下,我需要正則表達式來產生匹配。


背景:我需要使用正則表達式作爲路由contraint在ASP.NET MVC RouteCollection.MapRoute擴展方法。這條路線需要符合的所有控制器,但是當在URL中的控制器以.asp

回答

40

訣竅是使用negative lookbehind應該告吹。

如果你只需要是/否答案:

(?<!\.asp)$ 

如果需要匹配整個URL:其中的文件名出現在

^.*(?<!\.asp)$ 

這些正則表達式將會與任何URL工作URL的結尾(即沒有查詢或片段的URL)。假設你的問題中給出了正則表達式.asp $,那麼你的URL就符合這個限制。如果你想在正則表達式匹配整個URL

^[^#?]+(?<!\.asp)([#?]|$) 

或者這樣:如果你想讓它與所有的網址,可嘗試此

^[^#?]+(?<!\.asp)([#?].+|$) 
+0

第二個做了這個伎倆似乎,我需要做一些測試與更多的網址,但我的第一次單元測試現在通過,所以謝謝! – 2008-11-27 13:34:15

2

結束試試這個

^((?!\.asp$).)*$ 
+0

這個工作,但效率不高。沒有必要檢查.asp $無法匹配的每個位置。我們只需要在最後進行檢查。 – 2008-11-27 13:21:25

+0

也適用,我給了Jan更高效的答案。 謝謝! – 2008-11-27 13:35:46

3

不是一個正則表達式,但C#String.EndsWith方法這很容易完成這項工作。

string test1 = "me.asp" ; 
string test2 = "me.aspx" ; 

test1.EndsWith(".asp") // true; 
test2.EndsWith(".asp") // false ; 
相關問題