C# Regex.Replace替换了比议价更多的内容

C# Regex.Replace替换了比议价更多的内容,c#,.net,regex,iis,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]/bi

我正在为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;

请参见

您的输入字符串以
v1/bids/
开头,这就是输出相同的原因。我在问题中添加了更多信息。问题不在于如何正确地编写正则表达式,而在于如何测试编写正则表达式的人最终是否没有错过。*部分。因此,我的测试将与IIS的测试匹配。
{R:0}
$&
(或
$&
)。
v[1-9]/bids/
部分匹配输入字符串,这就是存在匹配的原因<代码>$0将保存与正则表达式模式匹配的整个文本。需要什么?我想检索IIS重写模块将实际重写到的字符串。在这种情况下,它将是
http://localhost:9900/v1/bids/
,这是不正确的。这意味着有人为重写规则编写了错误的正则表达式。正确的正则表达式可以是
v[1-9]/bids/*
。给定
v[1-9]/bids/
regex作为输入,我需要验证IIS是否确实将重写为包含Guid的完整路径。但事实并非如此。测试,不正确。我有一个单元测试来验证,给定字符串
v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a
,它将测试提供的正则表达式并返回
http://localhost:9900/v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a
而不是没有Guid的URL。我想我现在明白了。但是你真的认为IIS使用了
Regex.Replace
?这不是更像是一个
Regex.Match()
?整个匹配文本将附加到基本URL。