【问题标题】:IIS UrlRewrite RegEx differences with .NET RegExIIS UrlRewrite RegEx 与 .NET RegEx 的区别
【发布时间】:2016-07-19 15:16:54
【问题描述】:

我在 .NET 中有一个有效的 RegEx 模式:

(?>.*param1=value1.*)(?<!.*param2=\d+.*) 匹配 if:

  • 查询字符串包含param1=value1
  • 包含param2=一个数字

它适用于 .NET。然而 IIS URLRewrite 抱怨它不是一个有效的模式。

我不能在带有 IIS URLRewrite 的 (?<! ) 表达式后面使用零宽度否定外观吗?

请注意,我尝试在 web.config 中应用此模式(分别将 <> 正确更改为 <>,以及在 IIS 管理器中 - 均未成功。

【问题讨论】:

  • 你不能把它简化为^(?!.*param2=\d).*param1=value1吗?或者如果你需要匹配整个字符串,添加尾随.*:^(?!.*param2=\d).*param1=value1.*
  • @WiktorStribiżew 谢谢!这行得通!然而,关于差异的问题仍然存在。我认为使用的 2 个 RegEx 引擎是等效的。
  • 不,你可以看到语法不同。

标签: asp.net regex iis url-rewriting


【解决方案1】:

IIS URLRewrite 默认正则表达式语法是 ECMAScript,它与 .NET 正则表达式语法不兼容。见URL Rewrite Module Configuration Reference

ECMAScript – Perl 兼容(ECMAScript 标准兼容)正则表达式语法。这是任何规则的默认选项。

您根本不能使用前瞻,您只能依靠前瞻:

^(?!.*param2=\d).*param1=value1.*

模式说明

  • ^ - 字符串开头
  • (?!.*param2=\d) - 如果有param2= 后跟一个数字(\d),则在除换行符之外的 0+ 个字符之后匹配失败(返回不匹配)
  • .*param1=value1.* - 匹配包含 param1=value1 的整行

您可以通过在param1=value1 周围添加\b 来增强此规则,使其仅匹配整个单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2011-05-25
    相关资源
    最近更新 更多