Regex替换是在c#中多次替换同一个字符串

本文关键字:替换 同一个 字符串 Regex | 更新日期: 2023-09-27 18:04:11

我有一个大字符串的asp代码,我想修改它的一些部分使用正则表达式。我有一个模式,并希望取代它周围的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 ... /> -->-->-->-->

有人知道如何解决这个问题吗?巧合的是,模式的匹配恰好是相同的字符串,这就是为什么会发生这种情况,但通常情况下它可以是不同的。

Regex替换是在c#中多次替换同一个字符串

不要使用stringReplace()方法,而应该使用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现在包含

<!-- <asp:Image asdflk;jasd;lkfjas /> -->
<!-- <asp:Image something else runat="server" /> -->

这样,您就不需要循环遍历匹配项,因此每个匹配项只运行一次替换。每次循环时,当前代码都会被替换。

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

不要使用正则表达式来解析HTML。Regex不关心html的某些部分是否已经被注释掉了。使用一些至少能稍微理解html的解析器。看看这篇史诗般的文章:

RegEx匹配开放标签,除了XHTML自包含标签