2009-08-20 113 views

回答

24

改为RegExOptions.Singleline,它会工作得很好。 如果不是在单线模式,点任意字符,匹配除换行符

注意SinglelineMultiline不是相互排斥的。他们做了两件独立的事情。引用MSDN:

多行模式。变化 意思^和$所以他们分别匹配开头 和结束,任何线路, ,而不是仅仅是个开始和 整个字符串结束。

单行模式。 点的含义(。)所以它 匹配每个字符(而不是除\ n之外的每个字符的 )。

其他人已经建议的HTML敏捷性包。我只是觉得你应该解释为什么你的正则表达式不起作用:)

+4

+1进行测试,以回答实际问题。 – womp 2009-08-20 05:24:48

+0

是的,它的工作原理。起初我没有提供第三个参数,它没有工作,我认为RegExOptions.SingleLine是隐含的,但看起来像Multiline是默认的。 – MicMit 2009-08-20 06:27:47

+1

单线和多线不是对立的,不管名字的意思如何。这两个选项默认都是关闭的,设置一个对另一个没有影响。 Singleline改变点元字符的行为,Multiline改变'^'和'$'锚点的行为。 – 2009-08-20 06:56:42

7

请不要使用正则表达式来处理标记语言 - 您需要使用一种更好的工具来构建这种工作。

使用Html Agiliy Pack代替。我甚至发现this article其中(名叫西门Mourier)阅读器与使用HTML敏捷性包从一个文档中删除评论功能评论:

西蒙Mourier说:

这是一个示例代码删除 评论:

static void Main(string[] args) 
{ 
    HtmlDocument doc = new HtmlDocument(); 
    doc.Load("filewithcomments.htm"); 
    doc.Save(Console.Out); // show before 
    RemoveComments(doc.DocumentNode); 
    doc.Save(Console.Out); // show after 
} 

static void RemoveComments(HtmlNode node) 
{ 
    if (!node.HasChildNodes) 
    { 
     return; 
    } 

    for (int i=0; i<node.ChildNodes.Count; i++) 
    { 
     if (node.ChildNodes[i].NodeType == HtmlNodeType.Comment) 
     { 
      node.ChildNodes.RemoveAt(i); 
      --i; 
     } 
    } 

    foreach (HtmlNode subNode in node.ChildNodes) 
    { 
     RemoveComments(subNode); 
    } 
} 
+0

我在其他线程中看到了你的相似评论。我不确定为什么我应该使用更好的工具来偶尔在Web页面上提取起始和结束标记之间的hrefs,其中一些评论说。 – MicMit 2009-08-20 06:10:19

+0

安德鲁是对的。你不能用正则表达式解析[X] [HT] ML,除非(a)你事先知道一个非常有限的和固定的内容被使用,或者(b)你不关心你的结果有很多错误。解析注释比解析链接的可能性更小,因为链接的格式化有很多可变性,但它仍然不可靠。 – bobince 2009-08-20 09:29:25

+7

代码示例不起作用。枚举集合 – 2010-09-09 12:17:06

0

这一次为我的作品:

<!--(\n|.)*--> 

但我认为你可以使用XML的正常XML文档或其他HtmlAgilityPack HTML。高度不是建议使用RegEx解析标记。

+2

你应该在你的乘数上加一个非贪婪的量词,即。 '<! - (\ n |。)*? - >'此外,只需添加修改的SingleLine标志即可解决此问题。也接受换行.. – 2009-08-20 05:23:24

+0

@Matthew。是。我同意。你理论上是正确的。但我试过SingleLine标志,它不会改变结果。还有非贪心和贪婪的工作。使用radsoftware.com.au/?from=RegexDesigner – 2009-08-20 06:14:17

0

这是Google通过C#剥离注释的最好结果,这里是我的HtmlAgilityPack代码。

 HtmlDocument doc = new HtmlDocument 
          { 
           OptionFixNestedTags = true, 
           OptionOutputAsXml = true 
          }; 
     doc.LoadHtml(str); 

     // Script comments from the document. 
     if (doc.DocumentNode != null) 
     { 
      HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//comment()"); 
      if (nodes != null) 
      { 
       foreach (HtmlNode node in from cmt in nodes 
              where (cmt != null 
               && cmt.InnerText != null 
               && !cmt.InnerText.ToUpper().StartsWith("DOCTYPE")) 
               && cmt.ParentNode != null 
              select cmt) 
       { 
        node.ParentNode.RemoveChild(node); 
       } 
      } 
     } 

这可以在剥离注释时正确使用,并且忽略被HtmlAgilityPack当作注释处理的文档类型。

虽然正则表达式在受控条件下工作。如果你正在处理来自野生网站的HTML,那么我建议使用HtmlAgilityPack。那里的HTML是非常不可预测的,正则表达式会中断。