Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么是$1“;在我的Regex.Replace()结果中结束?_C#_Regex - Fatal编程技术网

C# 为什么是$1“;在我的Regex.Replace()结果中结束?

C# 为什么是$1“;在我的Regex.Replace()结果中结束?,c#,regex,C#,Regex,我试图编写一个正则表达式来重写指向代理服务器的URL bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr); 这个表达式的思想非常简单,基本上是查找“src=”/“或“src=”/”的实例,并在该点插入代理url。这在一般情况下是有效的,但有时我会发现文本“$1”会出现在结果字符串中 这对我来说毫无意义,因为如果没有匹配,那么为什么它会取代任何东西呢 不幸的是,我不能给出一个简单的例子,到目前为止,它只发生在非

我试图编写一个正则表达式来重写指向代理服务器的URL

bodystring = Regex.Replace(bodystring, "(src='/+)", "$1" + proxyStr);
这个表达式的思想非常简单,基本上是查找“src=”/“或“src=”/”的实例,并在该点插入代理url。这在一般情况下是有效的,但有时我会发现文本“$1”会出现在结果字符串中

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

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

顺便说一句,我尝试使用正向回溯重写此表达式,如下所示:

bodystring = Regex.Replace(bodystring, "(?<=src='/+)", proxyStr);
bodystring=Regex.Replace(bodystring,”(?当
proxyStr=“10.15.15.15:8008/proxy?url=http://“
时,替换字符串变为
”$110.15.15:8008/proxy?url=http://“
。它包含对组号110的引用,而组号肯定不存在

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

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

Rawling说.NET的regexp库解决了这个问题:您可以用大括号括住
1
,以避免假别名,如下所示:

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

在第二个版本中,我猜proxyStr会出现两次,因为您再次插入它。请重试

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

string s2=Regex.Replace(s),((?您正在做的事情无法完成..NET在像这样插入变量时遇到问题。您的问题是您的代理字符串以一个数字开头:
proxyStr=“10.15.15.15:8008/Proxy?url=http:/”

当您将其与
$1
组合时,regex必须查找不存在的backreference
$110


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

基于DasLinkedLights答案(已+1),解决方案如下:

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

这可以确保使用组1,而不是生成新的组号。

您能提供一个
proxyStr
值的示例吗?感谢您的回复。您能澄清一下吗?我不确定如何使用“\1”来解决此问题。上面我的意思是“$1”有时会出现在我的结果字符串中,如“…new Image().$1myproxy/proxy?url=…”.proxyStr=“10.15.15:8008/proxy?url=http:/”,但我发现第二个问题(结果中的多个proxyStr实例)即使使用proxyStr=“proxy”也会持续发生.Locksleyu您想匹配什么?您的正则表达式匹配src='////////////////////。我99.99%确定这是错误的。FailedDev,您是对的,表达式应该是“/{1,2}”,而不是“/+”。但是,当我替换为一切都是一样的时,它并不能解决我的根本问题。与其厚颜无耻地偷偷地提出一个适当的解决方案,不如先找出问题所在…请参见以下答案:基本上使用“${1}”而不是“$1”@罗琳:谢谢你指出这一点!我怀疑一定有合法的方法,甚至尝试了
($1)
,但我没有找到
${1}
回答。谢谢!!!谢谢你的主意。我试过这个,但没有用。我想我知道为什么它会被替换两次,但奇怪的是我认为+是一个“贪婪”操作符,所以如果有两个正斜杠,它就不会只匹配一个。