Regex.Replace()中的正则表达式返回引用

时间:2013-03-01 15:38:24

标签: c#

我正在使用正则表达式替换某些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,我试图替换'oldvalue'的{​​{1}}部分,它恰好位于html标记中。我的问题在于我试图通过使用后引用来替换文本周围的撇号。这个撇号可能是一些值,这就是我使用后向引用的原因。

1 个答案:

答案 0 :(得分:1)

如果我尝试使用您的代码,则不会进行任何替换,因为在您尝试替换的值之后没有分号。

如果从正则表达式中删除分号,则两者都有效:

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>