2008-11-27 76 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 ;