我试图从我的MVC项目中排除一些非常具体的路线。 更具体地说,我想忽略对.ashx页面的所有调用,除非它们匹配某种模式。
(?<!invoices\/(order|membership)\/(\d{5,})-([a-f0-9]{8}))\.ashx
这是我提出的模式,但由于你无法在否定的外观中使用量词,所以它无效。
关于如何实现这一点的任何想法,所以我可以通过这样的调用正确地忽略我的路线:
routes.Ignore("{*handlers}", new { handlers = "(?<!invoices/(order|membership)/(\\d{5,})-([a-f0-9]{8}))\\.ashx" });
答案 0 :(得分:1)
.NET正则表达式确实支持无限宽度的lookbehinds,因此你的模式的唯一问题是双反斜杠。使用\d
代替\\d
和\.
代替\\.
,或者使用字符类[0-9]
(数字)和[.]
解决问题(字面点):
(?<!invoices/(order|membership)/[0-9]{5,}-[a-f0-9]{8})[.]ashx
^^^^^ ^^^
你也可以摆脱外观,并使用一开始就固定的前瞻:
^(?!.*invoices/(order|membership)/[0-9]{5,}-[a-f0-9]{8}).*[.]ashx.
如果字符串包含,则(?!.*invoices/(order|membership)/[0-9]{5,}-[a-f0-9]{8})
否定前瞻将使匹配失败(删除第一个.*
以使其以开头){ {1}}模式。