繁体   English   中英

正则表达式替换代替讨价还价

[英]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将重写为。

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;

IDEONE演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM