2009-08-20 106 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是非常不可預測的,正則表達式會中斷。