我正在为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将重写的内容。
答案 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