2

我正在尝试匹配对没有文件夹字符 (/) 或以扩展名 (.aspx) 结尾的 url 的任何请求。我现在可以忽略正则表达式中的查询字符串值和片段。到目前为止,我有以下内容。

^([\w-/]+)(?!\.aspx|/)$

但是,如果我运行此表达式,它会选择我不希望它执行的组中的最后一个 /。目标是将 .aspx 附加到没有使用 Isapi ReWrite 指定的 url,然后将请求转发到 .NET 引擎。

下面的示例以粗体显示当前匹配中的所有字符

asd.aspx
this
something.aspx
this/test/ (不要最后的/)
this-test/ (不要最后的/)
this-test
this-test/that/test

任何人都可以建议一个不会选择最终 / 如果在表达式中找到的表达式?

4

4 回答 4

4

尝试一个后视断言:

^([\w-/]+)(?<!/|\.aspx)$
于 2009-11-18T09:32:49.263 回答
1

您的第一句话与您的正则表达式或示例不匹配。
在我看来,你想要:

  1. 如果字符串以.aspx不进一步处理结束。
  2. 否则,如果字符串以/删除该斜杠结尾。
  3. 处理字符串。

也许你试图用正则表达式做太多事情?

为什么不明确测试您的扩展名(.aspx),如果您没有,那么在对字符串进行额外处理之前检测一个终端斜杠并将其删除?

也就是说:我确信可以创建一个带有负前瞻的正则表达式,它将执行 1 和 2,但明确地执行它会不会更清楚。

您可能还想测试更多示例:

foo/bar/.aspx
foo/bar.aspx/
foo.aspx/bar
foo.aspx/bar/

只是为了确保您知道您期望的输出。

于 2009-11-18T10:05:38.437 回答
1

将 / 移到组外 ():

^([\w-/]+)(?!\.aspx)/?$
于 2009-11-18T09:29:11.920 回答
0

从正则表达式中删除 / 并将其添加到外部并指定它可以出现 0 或 1 次。

^([\w-/]+)(?!.aspx)(/){0,1}$

于 2009-11-18T09:31:23.370 回答