【问题标题】:Regex for ASP.NET url rewrite用于 ASP.NET url 重写的正则表达式
【发布时间】:2011-04-08 04:44:12
【问题描述】:

示例文本 =

legacycard.ashx?save=false&iNo=3&No=555

示例模式 =

^legacycard.ashx(.*)No=(\d+)

想要获取“555”的第 2 组值(示例文本中“No=”的值)

在 Expresso 中,这是可行的,但在 ASP.NET UrlRewrite 中,它无法捕获。

我错过了什么吗?

谢谢!

【问题讨论】:

  • 可能你的正则表达式是不贪婪的,所以它发现它匹配 No=3No=(\d+)

标签: asp.net regex url-rewriting


【解决方案1】:

我会按照这些思路做一些事情:

^legacycard.ashx\?(?:.+&)*No=(\d+)

\? 将转义通常分隔 URL 和参数的问号,然后您确保它会在您实际关心的参数之前捕获每个参数键/值对(以 & 结尾的任何内容)关于。使用?: 可以让您指定括号集是非捕获的(我假设您不需要任何数据,有可能稍微加快您的正则表达式)并且让您只捕获555。这种方法的额外好处是,无论参数顺序如何,它都可以工作。

【讨论】:

    【解决方案2】:

    只需使用这个正则表达式:

    ^legacycard\.ashx\?save=(false|true)&iNo=(?<ino>\d+)&No=(?<no>\d+)
    

    然后正则表达式替换为

    ${no}
    

    【讨论】:

      【解决方案3】:

      我觉得很好,你的正则表达式应该匹配整个字符串

      legacycard.ashx?save=false&iNo=3&No=555

      不知道为什么你有组,但组也应该返回

      ?save=false&iNo=3&

      555

      为了更好地衡量,您应该知道 . in legacycard.ashx 也被正则表达式解释,你通常会转义它,在这种情况下它并不重要,因为一个点匹配所有内容,也是一个点。 :)

      【讨论】:

        【解决方案4】:

        试试这个

        ^legacycard.ashx(\?No=|.*?&No=)(\d+)
        

        这应该可以。

        【讨论】:

        • 你不一定知道后面会不会有更多的参数,或者参数的顺序总是一样的。
        • 好的,我认为它总是在最后,因为您的正则表达式没有涵盖No=(\d+) 后面的任何内容。我已经更正了我的答案。
        • 这是一个合理的假设,我更喜欢 param order 是一个实现细节的观点,所以我尽量不依赖它,但在这种情况下可能无关紧要。此外,一旦您捕获了您关心的部分,您可能不需要指定字符串的其余部分在正则表达式中的样子。
        • 你是对的,无论如何,在 No 之前添加 & 号可以解决你的问题吗?
        • 不是我的问题 =)。它会解决您在评论中提出的问题(这是一个很好的观点),但如果 No 是第一个参数,因为 URL 将是 something.ashx?No=555&amp;...,则会失败。
        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多