我有一大串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 ... /> -->-->-->-->
有谁知道如何解决这个问题?巧合的是,模式的匹配碰巧是相同的精确字符串,这就是为什么会发生这种情况,但总的来说它可能会有所不同。
答案 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的解析器。看看这篇史诗帖子: