正则表达式替换在c#中多次替换相同的字符串

时间:2015-07-23 15:08:03

标签: c# regex

我有一大串asp代码,我想用regex修改它的某些部分。我有一个模式,并希望用它周围的html注释替换它的所有实例。到目前为止我有这个

foreach (Match controlMatch in Regex.Matches(bodyText, "<asp:Image.*?\\/>", RegexOptions.IgnoreCase | RegexOptions.Singleline))
{
  bodyText = bodyText.Replace(controlMatch.Groups[0].Value, "<!--" + controlMatch.Groups[0].Value + "-->");
}

但问题是,当我调用replace时,它会替换我已经包含在html注释中的所有其他实例,它最终看起来像

<!--<!--<!--<!--<asp:Image ... /> -->-->-->-->

有谁知道如何解决这个问题?巧合的是,模式的匹配碰巧是相同的精确字符串,这就是为什么会发生这种情况,但总的来说它可能会有所不同。

2 个答案:

答案 0 :(得分:0)

您应该使用string,而不是使用Replace()的{​​{1}}方法。您可以使用Regex.Replace()引用正则表达式模式中的第一个捕获组。要指定捕获组,请将模式包装在$1 s。

()

在此示例中,var bodyText = @" <asp:Image asdflk;jasd;lkfjas /> <asp:Image something else runat=""server"" /> "; var pattern = "(<asp:Image.*?\\/>)"; var replacementPattern = "<!-- $1 -->"; bodyText = Regex.Replace(bodyText, pattern, replacementPattern); 现在包含

bodyText

使用此功能,您无需循环匹配,因此每次匹配只会运行一次替换。每次循环时都会替换当前代码。

如果你想要更多智能替换来忽略已经注释的标签,你不应该使用正则表达式,你应该使用更强大的HTML解析器。

答案 1 :(得分:-1)

不要使用正则表达式来解析HTML。正则表达式并不关心html的某些部分是否已被注释掉。使用一些至少能理解html的解析器。看看这篇史诗帖子:

RegEx match open tags except XHTML self-contained tags