[英]Regex back references in Regex.Replace()
我正在使用正则表达式替换某些html代码中的值。 它可以正确匹配html代码中的所有实例,但是将Regex.Replace()与反向引用一起使用时,它不会替换反向引用。
例如
html = "<td>[element]elementreference='oldvalue';[/element]</td>";
html = Regex.Replace(html, @"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", "$1" + elementReference.Value + "$2", RegexOptions.IgnoreCase);
结果是:
"<td>[element]elementreference=$1newvalue'[/element]</td>"
但是如果我使用
html = "<td>[element]elementreference='oldvalue';[/element]</td>";
var regex = new Regex(@"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(html))
{
html = html.Replace(match.Value, match.Groups[1] + elementReference.Value + match.Groups[2]);
}
结果是
"<td>[element]elementreference='newvalue'[/element]</td>"
这是我所期望的。
谁能解释为什么使用Regex.Replace()无效?
编辑
我没有尝试替换内部html,而是试图替换[element]elementreference='oldvalue'[/element]
的'oldvalue'
部分,该部分恰好在html标记中。 我的问题在于我试图通过使用向后引用来替换文本周围的撇号。 这个撇号可以是多个值,这就是为什么我使用反向引用。
如果我尝试使用您的代码,则不会进行任何替换,因为要替换的值后面没有分号。
如果从正则表达式中删除分号,则两种方法都可以:
html = Regex.Replace(html, @"(['""#(=])" + "oldvalue" + @"(['""#)]|&)", "$1" + "asdf" + "$2", RegexOptions.IgnoreCase);
等同于:
var regex = new Regex(@"(['""#(=])" + "oldvalue" + @"(['""#)]|&)", RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(html))
{
html = html.Replace(match.Value, match.Groups[1] + "asdf" + match.Groups[2]);
}
当我尝试从问题中获取更新的代码时,它工作正常:
string html;
KeyValuePair<string, string> elementReference = new KeyValuePair<string, string>("oldvalue", "newvalue");
html = "<td>[element]elementreference='oldvalue';[/element]</td>";
html = Regex.Replace(html, @"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", "$1" + elementReference.Value + "$2", RegexOptions.IgnoreCase);
Console.WriteLine(html);
html = "<td>[element]elementreference='oldvalue';[/element]</td>";
var regex = new Regex(@"(['""#(=])" + elementReference.Key + @"(['""#)];|&)", RegexOptions.IgnoreCase);
foreach (Match match in regex.Matches(html)) {
html = html.Replace(match.Value, match.Groups[1] + elementReference.Value + match.Groups[2]);
}
Console.WriteLine(html);
输出:
<td>[element]elementreference='newvalue';[/element]</td>
<td>[element]elementreference='newvalue';[/element]</td>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.