2009-08-20 10 views

risposta

24

Sostituirlo con RegExOptions.Singleline e funzionerà correttamente. Quando non si trova in modalità Singleline, il punto corrisponde a qualsiasi carattere, eccetto newline.

Nota che Singleline e Multiline non si escludono a vicenda. Fanno due cose separate. Per quotare MSDN:

Modalità multilinea. Cambia il significato di ^ e $ in modo che corrispondano all'inizio e terminano, rispettivamente, di qualsiasi riga, e non solo l'inizio e la fine di l'intera stringa.

Modalità a linea singola. Modifiche il significato del punto (.) In modo che corrisponda a ogni carattere (invece di ogni carattere tranne \ n).

Altre persone hanno già suggerito l'HTML Agility Pack. Ho appena sentito che dovresti avere una spiegazione sul motivo per cui il tuo Regex non funzionerebbe :)

+4

+1 per rispondere alla domanda effettiva. – womp

+0

Sì, funziona. All'inizio non ho fornito il terzo parametro e non ha funzionato e pensavo che RegExOptions.SingleLine fosse implicito, ma sembra che Multiline sia l'impostazione predefinita. – MicMit

+1

Singleline e Multiline non sono opposti, non importa ciò che i nomi sembrano implicare. Entrambe le opzioni sono disattivate per impostazione predefinita e l'impostazione di una non ha effetto sull'altra. Singleline modifica il comportamento del punto metacarattere e Multiline cambia il comportamento degli ancoraggi '^' e '$'. –

7

Si prega di non utilizzare espressioni regolari per lavorare con i linguaggi di marcatura - è necessario utilizzare uno strumento migliore che è costruito per quel tipo di lavoro.

Utilizzare invece Html Agiliy Pack. Ho anche trovato this article in cui un lettore (di nome Simone Mourier) commenta con una funzione che utilizza il codice HTML Agility Pack rimuovere i commenti da un documento:

Simon Mourier detto:

Questo è un esempio codice per rimuovere commenti:

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

Ho visto il tuo commento simile in un'altra discussione.Non sono convinto del perché dovrei usare uno strumento migliore per lo scraping occasionale del web che estrae hrefs tra marker di inizio e fine nella pagina html, alcuni dei quali commentati. – MicMit

+0

Andrew ha ragione. Non è possibile analizzare [X] [HT] ML con espressioni regolari, a meno che (a) non si sappia in anticipo che viene utilizzato un set di contenuti molto limitato e fisso o (b) non si tengano presenti molti errori nei risultati. È meno probabile che i commenti di analisi si interrompano rispetto all'analisi dei collegamenti, poiché la formattazione dei collegamenti è molto più varia, ma è ancora inaffidabile. – bobince

+7

L'esempio di codice non funziona. Non è possibile modificare i nodi durante l'enumerazione sulla raccolta –

0

Questo funziona per me:

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

Ma penso che potresti utilizzare il normale documento XML per XML o altrimenti HtmlAgilityPack per HTML. Molto non che consiglia di analizzare il markup utilizzando RegEx.

+2

Dovresti mettere un quantificatore non avido sul tuo moltiplicatore, es. '' Inoltre, questo problema può essere risolto semplicemente aggiungendo il flag SingleLine che modifica. per accettare anche le nuove righe. –

+0

@ Matthew. Sì. Sono d'accordo. Teoricamente hai ragione. Ma ho provato il flag SingleLine e non cambia il risultato. Anche il lavoro non avido e avido. Testato utilizzando radsoftware.com.au/?from=RegexDesigner –

0

Questo è il primo risultato di Google per l'eliminazione dei commenti tramite C#, ed ecco il mio codice HtmlAgilityPack per farlo.

 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); 
       } 
      } 
     } 

Questo funziona correttamente a commenti di stripping, e ignora il tipo di documento che è considerato un commento di HtmlAgilityPack.

Mentre la regex funziona in condizioni controllate. Se stai elaborando HTML dal Web selvaggio, ti consigliamo di utilizzare HtmlAgilityPack. L'HTML che è là fuori è molto imprevedibile e la regex si interromperà.