为什么"$ 1"会在我的Regex.Replace()结果中结束?

Loc*_*eyu 8 c# regex

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

bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr);
Run Code Online (Sandbox Code Playgroud)

这种表达的想法很简单,基本上找到"src ="/"或"SRC =" //"实例,并在该点插入一个代理URL.这通常有效但偶尔我会发现文字"$ 1"最终会出现在结果字符串中的情况.

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

不幸的是,我不能给出一个简单的例子,在它只有非常大的绳子,会发生,到目前为止,但我想从概念上知道什么可以让这样的事情发生.

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

bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr);
Run Code Online (Sandbox Code Playgroud)

但如果输入字符串包含"src ='//",则最终会在输出中使用proxyStr TWICE.这也没有多大意义,因为我认为"SRC ="必须是存在于输入为了得到proxyStr在两次输出最终的两倍.

das*_*ght 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);
Run Code Online (Sandbox Code Playgroud)

编辑:

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

bodystring = Regex.Replace(bodystring, "(src='/+)", "${1}" + proxyStr);
Run Code Online (Sandbox Code Playgroud)