C# 了解查找多行HTML注释的正则表达式

C# 了解查找多行HTML注释的正则表达式,c#,javascript,html,.net,regex,C#,Javascript,Html,.net,Regex,我在这里找到了一个正则表达式,我正在寻找一个我不理解的行为的解释。正则表达式应该查找不在脚本或样式标记内的多行HTML注释。我正在使用它构建一个应用程序,可以在构建后剥离浏览器可访问的评论。例如,找到这个 <!-- I am an ordinary comment and I need two lines --> 但不是这个 <script language="javascript1.2"> <!-- function window_Onload() {

我在这里找到了一个正则表达式,我正在寻找一个我不理解的行为的解释。正则表达式应该查找不在脚本或样式标记内的多行HTML注释。我正在使用它构建一个应用程序,可以在构建后剥离浏览器可访问的评论。例如,找到这个

<!-- I am an ordinary comment
and I need two lines -->

但不是这个

<script language="javascript1.2">
<!--
function window_Onload()
{   
    alert('I am the on load event');
}
window.onload=window_Onload;
//-->
</script>

一旦找到,我可以删除第一个注释块,而忽略第二个注释块

以下模式完美地实现了上述功能:

string multilinePattern = @"<!--((?!-->).)+-->(?>((?!</?(script|style)).)*)(?!</(script|style))";
match = Regex.Match(text, multilinePattern);
                    if (match.Success)
                    {
                        output.WriteLine("{0}", match.Value);
                    }

string multiliepattern=@”)+-->((?>((?!OK以下是如何使用HtmlAgilityPack完成的

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var comments = doc.DocumentNode
                .Descendants()
                .Where(d => d.Name == "#comment")
                .Select(d => d.InnerText)
                .ToList();

在我的测试中,它在两种情况下都只匹配注释。但是如果我指定了
Singleline
选项(您应该这样做),它在两种情况下都匹配整个shebang。是否您在第二次测试中是在
Singleline
模式下进行匹配,而不是在第一次测试中

但无论如何,这是一个糟糕的正则表达式。在注释匹配后,原子组匹配并使用任何不是脚本或样式标记(开始或结束)的内容,然后前瞻断言后面的内容不是结束脚本或样式标记

您不希望在评论结束后使用任何内容;这应该是一个负面展望。例如:

(?inxs)
<!--((?!-->).)+-->
(?!
  ((?!</?(script|style)).)*
  </(script|style)
)

这为我返回了正确的结果。另外:你真的不应该使用正则表达式来解析HTML。你问这个问题并且有匹配标记的问题,这正是你不应该这样做的原因。关于正则表达式和HTML有几十个问题,他们都说,不要这样做!改用HTMLAGILIPPACK。@CasimiritHippolyte,th这里有一些方法可以标记一条您可能认为是非建设性的评论,而不是诉诸于广告人攻击。我是想提供帮助,我认为HTML Agility Pack就是一种方法。@CasimiritHippolyte这个问题存在的事实是否不支持paqo的评论?OP很难将极为相似的标记与单个正则表达式。这是反对在HTML中使用正则表达式的全部理由。这仍然是“解析”。老实说,如果你删除注释..这对于HTML Agility Pack来说是微不足道的..这正是该库的用途。虽然我可能会尝试HTML Agility Pack(我只是没有足够的时间来学习这个项目中的正则表达式)这个表达式工作得很好。我很感激解释为什么它工作而另一个不工作。另外,忘了提一下,我在第二次测试中没有使用
单线
模式,而不是第一次。这两个测试都是由一个应用程序的一次运行产生的,该应用程序迭代所有文件中的所有文本,并报告它找到的匹配项。因此,如果测试使用的是
单线
模式,另一个也是。再次感谢。
<!-- Outside Table -->

<table  summary="<%= GetLocalResourceObject("LayoutTable.SummaryText") %>" class="tabTableCell"   cellpadding="0" cellspacing="0" width="750" align="center" >

    <tr>

        <td class="tableHeader">&nbsp;</td>
<!-- Outside Table -->

<table  summary="<%= GetLocalResourceObject("LayoutTable.SummaryText") %>" class="tabTableCell"   cellpadding="0" cellspacing="0" width="750" align="center" >

    <tr>
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var comments = doc.DocumentNode
                .Descendants()
                .Where(d => d.Name == "#comment")
                .Select(d => d.InnerText)
                .ToList();
(?inxs)
<!--((?!-->).)+-->
(?!
  ((?!</?(script|style)).)*
  </(script|style)
)
@"(?ins)<!--((?!-->).)+-->(?!((?!</?(script|style)).)*</(script|style))"