为什么“$ 1”最终出现在我的Regex.Replace()结果中?

我正在尝试编写正则表达式来重写URL以指向代理服务器。

bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr); 

这个表达式的想法很简单,基本上找到“src =’/”或“src =’//”的实例,并在那一点插入一个PROXY url。 这通常有效但偶尔我会发现文字“$ 1”最终会出现在结果字符串中的情况。

这对我没有意义,因为如果没有匹配,那为什么它会取代任何东西呢?

不幸的是,我不能给出一个简单的例子,到目前为止它只发生在非常大的字符串上,但是我想在概念上知道什么可以使这种事情发生。

顺便说一下,我尝试使用正面lookbehind重写此表达式,如下所示:

 bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr); 

但如果输入字符串包含“src =’//”,则最终会在输出中使用proxyStr TWICE。 这对我来说也没有多大意义,因为我认为“src =”必须在输入中出现两次才能让proxyStr在输出中结束两次。

proxyStr = "10.15.15.15:8008/proxy?url=http://" ,替换字符串变为"$110.15.15.15:8008/proxy?url=http://" 。 它包含对组号110的引用,当然不存在。

您需要确保代理字符串不以数字开头。 在你的情况下,你可以通过不捕获最后一个斜杠,并将替换字符串更改为"$1/"+proxyStr ,如下所示:

 bodystring = Regex.Replace(bodystring, "(src='/*)/", "$1/" + proxyStr); 

编辑:

Rawling 指出 .NET的regexp库解决了这个问题:你可以在花括号中包含1以避免错误的别名,如下所示:

 bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr); 

你做的不能做。 像这样插入变量时,.NET有问题。 您的问题是您的代理字符串以数字开头: proxyStr = "10.15.15.15:8008/proxy?url=http://"

当你将它与$1结合使用时,正则表达式需要寻找不存在的后向引用$110

看看我的意思。

您可以通过匹配其他内容,或通过手动匹配和构建替换字符串等来解决此问题。使用最适合您的方法。

根据dasblinkenlights答案(已经+1)解决方案是这样的:

 bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr); 

这可确保使用组1,而不是构建新的组编号。

在第二个版本中,我猜proxyStr出现两次,因为你再次插入它。 尝试

 string s2 = Regex.Replace(s, "((?<=src='/+))", proxyStr);