正则表达式 - 匹配模式A,除非它与模式B匹配

时间:2016-06-22 06:10:09

标签: c# regex

我试图从我的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" });

1 个答案:

答案 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}}模式。