Regex.Replace取代了

时间:2016-04-12 13:37:31

标签: c# .net regex iis

我正在为IIS重写规则编写一些测试用例,但我的测试与IIS的测试方式不一致,导致一些漏报。

有谁可以告诉我为什么以下两行导致相同的结果?

Regex.Replace("v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a", ".*v[1-9]/bids/.*", "http://localhost:9900/$0")
Regex.Replace("v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a", "v[1-9]/bids/", "http://localhost:9900/$0")

两者都返回:

http://localhost:9900/v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a

但我希望最后一个正则表达式返回:

http://localhost:9900/v1/bids/

由于GUID不匹配。

在IIS上,模式测试器产生以下结果。 {R:0}不等同于$0吗?

我要问的是:

鉴于v[1-9]/bids/的测试输入,我如何匹配IIS'做正则表达式的方法取代,以便得到结果http://localhost:9900/v1/bids/,这似乎是IIS将重写的内容。

IIS Regex Matching

1 个答案:

答案 0 :(得分:2)

这里的要点是你所拥有的模式在开始时匹配测试字符串。

第一个.*v[1-9]/bids/.*正则表达式匹配0 +任何字符,但是换行符(尽可能多)直到最后v后跟一个数字(0除外),然后跟随/bids/,然后是换行符以外的0+个字符。由于字符串在开头匹配,因此匹配整个字符串并将其放入组0.在替换中,您只需将http://localhost:9900/预先挂起到该值。

第二个正则表达式替换返回相同的结果,因为正则表达式匹配v1/bids/,将其存储在组0中,并将其替换为http://localhost:9900/ + v1/bids/。剩下的只是附加到替换结果,因为它不匹配。

你需要匹配" tail"为了删除它。

要仅获取http://localhost:9900/v1/bids/,请在v[0-9]/bids/周围使用捕获组,并在替换部分中使用$1反向引用:

(v[1-9]/bids/).*

替换为http://localhost:9900/$1。结果:http://localhost:9900/v1/bids/

请参阅regex demo

<强>更新

IIS保留基本URL,然后将匹配的部分与正则表达式相加。因此,在您的情况下,您将http://localhost:9900/作为基本网址,然后将v1/bids/与正则表达式匹配。因此,要模拟此行为,只需使用Regex.Match

var rx = Regex.Match("v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a", "v[1-9]/bids/");
var res = rx.Success ? string.Format("http://localhost:9900/{0}", rx.Value) : string.Empty;

请参阅IDEONE demo