4

我正在设计一个正则表达式以在某些 IIS Url Rewrites 中使用。目的是捕获以下网址:

  1. 不只是根目录中的一个文件(通过包含句点来标识),并且
  2. 不包含查询字符串,并且
  3. 不属于一组特定的子目录,特别是“Account”和“Public”

我当前的正则表达式看起来像:

^(?!(Account)|(Public))([^./]+)(/[^?]*)?$

RegexPal与以下测试集一起使用:

file.aspx
Account/otherfile.aspx
Public/otherfile.aspx
otherfolder1/otherfile.aspx?stuff=otherstuff
otherfolder2/otherfolder/otherfile.aspx
otherfolder3/
otherfolder4

我的正则表达式正确地忽略了前两种情况,但它仍然匹配第三种情况。这里的前瞻有什么问题?

4

4 回答 4

3

我忍不住试图想出一些可以在 RegExPal 中工作的东西(没有成功 -编辑:刚刚验证,这在 RegExpal 中确实有效)但我想我会把它作为另一种方式来做你需要的,这可能更容易理解:

^(?!Account|Public|[a-zA-Z_0-9]+\.)[a-zA-Z_0-9/.]+$

解释:

^                   # start
(?!                 # open a negative lookahead
Account|Public|     # ignore both Account and Public
[a-zA-Z_0-9]+\.     # ignore files in root (i.e., letters/numbers, followed by period)
)                   # close negative lookahead
[a-zA-Z_0-9/.]+     # now match anything with letters/numbers, periods and slashes, but no '?' (ignores URLs with query string)
$                   # end
于 2012-04-20T22:29:03.760 回答
1

正如sln所报告的那样,RegexPal 中这些测试的问题在于,运行多行测试可以使多行组合在一起以创建单个匹配,否则它们不应该匹配。

正则表达式适用于它旨在实现的目的。其实是矫枉过正。对于 IIS 重写和重定向,如果您使用IIS URL 重写模块,您可以选择指定它接受或不接受匹配的条件。其中一些选项包括:

  • 项目不是物理文件
  • 项目不是物理目录
  • 项目确实(或不)匹配辅助模式

这些将比负前瞻更完全地达到预期的效果。

于 2012-04-20T20:40:07.647 回答
1

RegexPal 很困惑,但真正的问题是正则表达式设计不正确。

不确定您要做什么,但是在使用多行模式和^$
正则表达式中的锚点时,除非您专门以这种方式设计,否则必须注意不要
溢出锚点。这适用于贪婪/非贪婪量词。
当将负面的前瞻条件加入混合时,情况会变得更糟。

在这种情况下,它导致 RegexPal 在^
没有重新评估 ^ 的情况下发疯并且显然在之前回溯。不过,这可能不是 JavaScript 问题。

在您的消费类中添加 not newline 可以解决所有问题。它必须
添加到两个类中。

^(?!Account|Public)[^./\n]+(?:/[^?\n]*)?$
于 2012-04-21T00:36:45.193 回答
0

也许你想使用^(?!Account|Public)([^\.\/]+\/[^\?]*)$正则表达式。

看看这里:http: //ideone.com/q3lAv

那么正确的 RegExpal 模式将是^(?!Account|Public)([^\.\/]+\/[^\?\n]*)$


[更新]

文件名不必.在其名称中包含点,另一方面,文件夹/目录名称可能.在其名称中包含点,但如果你想在第 7 行也有一个正匹配,那么你应该使用模式^(?!Account|Public)([^\.\/]+(?:\/[^\?]*|[^\.\?]*))$和它也应该作为 RegExPal 模式工作。

看看这里:http: //ideone.com/VcmEP

于 2012-04-20T21:59:47.747 回答