【发布时间】:2024-05-02 23:10:03
【问题描述】:
我正在设计一个用于某些 IIS 网址重写的正则表达式。目的是捕获以下网址:
- 不只是根目录中的文件(通过包含句点来标识),并且
- 不包含查询字符串,并且
- 不属于特定的子目录集,特别是“Account”和“Public”
我当前的正则表达式看起来像:
^(?!(Account)|(Public))([^./]+)(/[^?]*)?$
将RegexPal 与以下测试集一起使用:
file.aspx
Account/otherfile.aspx
Public/otherfile.aspx
otherfolder1/otherfile.aspx?stuff=otherstuff
otherfolder2/otherfolder/otherfile.aspx
otherfolder3/
otherfolder4
我的正则表达式正确地忽略了前两种情况,但它仍然匹配第三种情况。这里的前瞻有什么问题?
【问题讨论】:
-
这...对我来说似乎在 RegexPal 中按预期工作。您只希望示例中的最后 3 个匹配,对吗?
-
正确。对我来说,它匹配 2、3、5、6 和 7。
-
好吧,这真的很奇怪。我在实际测试中将示例隔开 - 在每个示例之间放置一个空行。如果我删除空行,它确实会给出预期的结果。
-
是的,我不完全确定那里发生了什么。对于它的价值,我在 C# 中做了一个快速测试,它也产生了正确的结果。
-
只是为了记录
(?!(Account)|(Public))是负前瞻,而不是后瞻。Account和Public周围的括号不做任何事情,因为前瞻不参与匹配。我相信应该是这样的:(?!Account|Public)。否则,正则表达式似乎确实有效,尽管在 RegExpal 中没有
标签: regex iis url-rewriting negative-lookahead regex-lookarounds