[英]Regex.Replace replaces more than bargained for
我正在为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的Regex替换方式,以便获得结果http://localhost:9900/v1/bids/
,这似乎是IIS将重写为。
这里的要点是您拥有的模式在开始时就与测试字符串匹配。
前一个.*v[1-9]/bids/.*
正则表达式匹配0+任何字符,但换行符(尽可能多)直到最后一个v
后跟一个数字(非0
),然后是/bids/
,然后输入0+个除换行符以外的字符。 由于字符串在开头是匹配的,因此整个字符串都将被匹配并放入组0。在替换中,您只需在http://localhost:9900/
添加该值。
第二次正则表达式替换返回相同的结果,因为正则表达式匹配v1/bids/
,将其存储在组0中,并用http://localhost:9900/
+ v1/bids/
替换。 剩余的内容将被追加到替换结果中,因为它不匹配。
您需要匹配该“尾巴”才能将其删除。
要仅获取http://localhost:9900/v1/bids/
,请在v[0-9]/bids/
周围使用捕获组,并在替换部分中使用$1
反向引用:
(v[1-9]/bids/).*
替换为http://localhost:9900/$1
。 结果: http://localhost:9900/v1/bids/
更新
IIS保留基本URL,然后添加与正则表达式匹配的部分。 因此,在您的情况下,您将http://localhost:9900/
作为基本URL,然后将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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.