【问题标题】:Regular expression to match a string (1+ characters) that does NOT end in .ext (extension)正则表达式匹配不以 .ext(扩展名)结尾的字符串(1+ 个字符)
【发布时间】:2008-11-27 13:00:31
【问题描述】:

我需要测试一个.asp结尾的网址

所以testtest.htmltest.aspx 应该匹配,但test.asp 不应该匹配。

通常您会测试 url 是否 以 .asp 结尾,并在代码中使用 NOT 运算符来否定它匹配的事实:

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

在这种情况下,正则表达式将是\.asp$,但在这种情况下,我需要正则表达式来产生匹配。


背景:我需要在 ASP.NET MVC RouteCollection.MapRoute 扩展方法中使用正则表达式作为路由约束。路由需要匹配所有控制器,但当 url 中的控制器以 .asp 结尾时,它应该会失败

【问题讨论】:

    标签: c# .net asp.net-mvc regex


    【解决方案1】:

    诀窍是使用negative lookbehind

    如果您只需要一个是/否的答案:

    (?<!\.asp)$
    

    如果需要匹配整个网址:

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

    这些正则表达式适用于文件名出现在 URL 末尾的任何 URL(即没有查询或片段的 URL)。鉴于您问题中的正则表达式 .asp$,我假设您的 URL 符合此限制。如果您希望它适用于所有 URL,请尝试以下操作:

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

    或者,如果您希望正则表达式匹配整个 URL:

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

    【讨论】:

    • 第二个似乎成功了,我需要用更多的 url 做一些测试,但是我的第一个单元测试现在通过了,所以谢谢!
    • +1 了解更多信息。小小的挑剔:问题标题注释“1+ 个字符”,我相信你的前两个正则表达式会匹配空字符串。
    • 在 ASP.NET MVC 路由约束的上下文中,URL 被分块检查: {controller}/{action}/{id} 正则表达式应该匹配 {controller} 部分,所以'the end' 并不总是 url 的结尾,而是 end 的 {controller} 部分的结尾。
    【解决方案2】:

    不是正则表达式,而是可以轻松完成这项工作的 c# String.EndsWith 方法。

    string test1 = "me.asp" ;
    string test2 = "me.aspx" ;
    
    test1.EndsWith(".asp") // true;
    test2.EndsWith(".asp") // false ;
    

    【讨论】:

    • 不,-1 不是正则表达式,抱歉这么严格;-)
    • 问题是,在 RouteMap 方法的上下文中,它需要的。
    • @anonymous-one:请阅读问题:它必须是正则表达式,这个答案不符合问题的标准,因为它不是正则表达式。
    • -1 同意学习正则表达式的观点。
    【解决方案3】:

    试试这个

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

    【讨论】:

    • 这可行,但效率低下。无需检查 .asp$ 无法匹配的每个位置。我们只需要在最后做检查。
    • 同样有效,我给 Jan 的答案是为了提高效率。谢谢!
    猜你喜欢
    • 2021-01-17
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2019-11-05
    • 2016-12-07
    • 2015-09-28
    相关资源
    最近更新 更多