为什么“$1”会出现在我的Regex.Replace()结果中?我正在尝试编写一个正则表达式来重写URL以指向代理服务器。bodystring=Regex.Replace(bodystring,"(src='/+)","$1"+proxyStr);这个表达式的思路很简单,基本上就是找到“src='/”或者“src='//”实例,然后在那个点插入一个PROXYurl。这通常有效,但偶尔我会发现文字“$1”最终出现在结果字符串中的情况。这对我来说没有意义,因为如果没有匹配项,那为什么要替换任何东西呢?不幸的是我不能给出一个简单的例子,到目前为止它只发生在非常大的字符串上,但我想从概念上知道是什么让这种事情发生。顺便说一句,我尝试用这样的正面回顾重写这个表达式:bodystring=Regex.Replace(bodystring,"(?<=src='/+)",proxyStr);但是如果输入字符串包含“src='//',你最终会在输出中使用proxyStrTWICE。这对我来说也没有多大意义,因为我认为“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的正则表达式库解决了这个问题:您可以在花括号中包含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出现了两次,因为你再次插入了它。试试上面的C#学习教程:为什么"$1"endupinmyRegex.Replace()result?如果分享的所有内容对你有用,需要了解更多C#学习教程,希望你多多关注——strings2=Regex.Replace(s,"((?本文收集自网络,不不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
