【问题标题】:Regex back references in Regex.Replace()Regex.Replace() 中的正则表达式反向引用
【发布时间】:2013-03-01 15:38:24
【问题描述】:

我正在使用正则表达式替换某些 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 - 获取 HTMLAgilityPack。 stackoverflow.com/a/1732454/847383
  • 你能进一步解释你的问题吗?您提供的输出正是我希望您的正则表达式创建的。
  • 我认为您应该使用可用的 .net xml 文档类来修改 xhtml - 或者 - 如果需要在客户端使用 jQuery。
  • 另外,这不是您的确切代码。您发布的代码无法编译

标签: c#


【解决方案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>

【讨论】:

  • 我在编辑问题中的行时错过了分号。正则表达式需要分号
  • @LisaYoung:如果您在原始值中添加分号,那么代码就可以正常工作。
  • 每次我运行代码时,使用 Regex.Replace() 输出确实包含 $1 而不是反向引用。
  • @LisaYoung:我不能重复。当我尝试代码时,直接从问题中粘贴而没有任何修改,它工作正常。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2018-07-13
  • 1970-01-01
相关资源
最近更新 更多