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