2011-04-07 83 views
0

示例文本=正则表达式ASP.NET URL重写

legacycard.ashx?save=false&iNo=3&No=555 

样本模式=

^legacycard.ashx(.*)No=(\d+) 

要抢组# “555”(该值的2值 “否=” 在示例文本)

在Expresso中,这可以工作,但在ASP.NET UrlRewrite中,它并没有捕捉到。

我错过了什么吗?

谢谢!

+1

可能是你的正则表达式是ungreedy,所以它抓住它匹配**否= 3 **有**否= (\ d +)**。 – 2011-04-07 19:43:19

回答

0

我会做这些方针的东西:

^legacycard.ashx\?(?:.+&)*No=(\d+) 

\?将逃跑的问号通常分开URL和参数,则确保它会捕捉每一个参数键/值对(任何以&结尾的东西)在你真正关心的参数之前。使用?:可以让你指定一组括号是非捕获的(我假设你不需要任何数据,有可能稍微加快你的正则表达式),并且你只需要捕获这些数据。这种方法的附加好处是它可以工作,而不管参数顺序如何。

0

看起来好像没什么问题,你的正则表达式应该将整个字符串

legacycard.ashx匹配?保存=假& INO = 3 &否= 555

不知道为什么你有群,但团体也应该返回

?保存=假& INO = 3 &

良好的措施,你应该知道的。在legacycard.ashx也被正则表达式解释,你通常会逃避它,在这种情况下它不重要,因为一个点匹配所有的东西,也是一个点。 :)

0

试试这个

^legacycard.ashx(\?No=|.*?&No=)(\d+) 

这应该工作。

+0

你不一定知道是否会有更多的参数后或参数的顺序将永远是相同的。 – R0MANARMY 2011-04-07 19:47:08

+0

好的,我认为它会一直在最后,因为你的正则表达式不包含'No =(\ d +)'背后的任何内容。我纠正了我的答案。 – 2011-04-07 20:01:39

+0

这是一个合理的假设,我更喜欢param order是一个实现细节的观点,所以我尽量不依赖它,但在这种情况下可能并不重要。另外,一旦你捕获了你关心的部分,你可能不需要指定正则表达式中字符串的其他部分。 – R0MANARMY 2011-04-07 20:08:33

0

只要使用这个表达式:

^legacycard\.ashx\?save=(false|true)&iNo=(?<ino>\d+)&No=(?<no>\d+) 

然后正则表达式替换

${no}