为什么" $ 1"最终在我的Regex.Replace()结果?

时间:2011-12-08 15:01:24

标签: c# regex

我正在尝试编写正则表达式来重写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在输出中结束两次。

4 个答案:

答案 0 :(得分:13)

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 pointed out .NET的regexp库解决了这个问题:你可以将1括在大括号中以避免错误别名,如下所示:

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

答案 1 :(得分:1)

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

开头

当您将其与$1结合使用时,正则表达式必须寻找不存在的反向引用$110

<强> See what I mean here.

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

答案 2 :(得分:1)

基于dasblinkenlights答案(已经+1),解决方案就是:

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

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

答案 3 :(得分:0)

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

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