题
我正在尝试匹配对不包含文件夹字符 (/) 或以扩展名 (.aspx) 结尾的 URL 的任何请求。我现在可以忽略正则表达式中的查询字符串值和片段。到目前为止我有以下内容。
^([\w-/]+)(?!\.aspx|/)$
但是,如果我运行此表达式,它会选择我不希望它执行的组中的最后一个 / 。目标是将 .aspx 附加到未使用 Isapi ReWrite 指定的 url,然后将请求转发到 .NET 引擎。
下面的示例以粗体显示当前匹配中的所有字符
asd.aspx
这
某事.aspx
这个/测试/ (不想要最后的/)
这个测试/ (不想要最后的/)
本次测试
这个测试/那个/测试
任何人都可以建议一个不会选择最终 / if 在表达式中找到的表达式吗?
解决方案
尝试查找后面断言:
^([\w-/]+)(?<!/|\.aspx)$
其他提示
移动/组外():
^([\w-/]+)(?!\.aspx)/?$
您的第一句话与您的正则表达式或示例不匹配。
在我看来你想要:
- 如果字符串结尾为
.aspx
不要进一步处理。 - 否则如果字符串以
/
删除该斜杠。 - 处理字符串。
也许您尝试使用正则表达式做太多事情?
为什么不显式测试您的扩展名 (.aspx),如果没有扩展名,则在对字符串进行额外处理之前检测终端斜杠并将其删除?
也就是说:我确信可以创建一个带有负向前瞻的正则表达式,它将执行 1 和 2,但显式地执行它不是更清楚吗?
您可能还想测试更多示例:
foo/bar/.aspx
foo/bar.aspx/
foo.aspx/bar
foo.aspx/bar/
只是为了确保您知道您期望的输出是什么。
从正则表达式删除/和外添加它,并指定其可具有0或1的发生。
^([\ W - /] +)(?!CSS)(/){0,1} $
不隶属于 StackOverflow