2009-08-20 11 views

Odpowiedz

24

Zamiast tego zmień go na RegExOptions.Singleline i będzie działał dobrze. Gdy nie jest w trybie Singleline, kropka pasuje do dowolnego znaku, , z wyjątkiem nowego wiersza.

Należy pamiętać, że Singleline i Multiline nie wykluczają się wzajemnie. Robią dwie oddzielne rzeczy. Zacytować MSDN:

trybu wielowierszowego. Zmienia znaczenie ^ i $ więc pasuje na początku i na końcu odpowiednio z każdej linii, i nie tylko początek i koniec cały ciąg.

Tryb pojedynczej linii. Zmienia znaczenie kropki (.), Aby dopasowywał każdy znak (zamiast każdy znak za wyjątkiem \ n).

Inne osoby już zasugerowały pakiet Agility HTML. Po prostu poczułem, że powinieneś wytłumaczyć, dlaczego Twój Regex nie zadziałał :)

+4

+1 za odpowiedź na faktyczne pytanie. – womp

+0

Tak, to działa. Na początku nie dostarczyłem trzeciego parametru i nie zadziałało i myślałem, że RegExOptions.SingleLine jest domniemane, ale wygląda na to, że Multiline jest domyślny. – MicMit

+1

Singeleline i Multiline nie są przeciwieństwami, bez względu na to, co sugerują imiona. Obie opcje są domyślnie wyłączone, a ustawienie jednej nie ma wpływu na drugą. Singleline zmienia zachowanie metaznaku kropki, a Multiline zmienia zachowanie kotwic "^" i "$". –

7

Proszę nie używać wyrażeń regularnych do pracy z języków znaczników - trzeba użyć lepszego narzędzia, który jest wbudowany do tego rodzaju pracy.

Zamiast tego użyj Html Agiliy Pack. Znalazłem nawet this article w którym czytnik (o nazwie Simon Mourier) Komentarze z funkcją, która używa html Agility Pack do usuwania komentarzy z dokumentu:

Simon MOURIER powiedział:

Jest to próbka Kod do usunięcia komentarzy:

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

Widziałem podobny komentarz w innym wątku.Nie jestem przekonany, dlaczego powinienem użyć lepszego narzędzia do okazjonalnego skrobania przez WWW wyodrębniania href pomiędzy znacznikiem początkowym i końcowym na stronie html, którą niektórzy komentowali. – MicMit

+0

Andrew ma rację. Nie możesz sparsować [X] [HT] ML za pomocą wyrażenia regularnego, chyba że (a) wiesz z góry, że używany jest bardzo ograniczony i ustalony zestaw treści lub (b) nie masz nic przeciwko dużej ilości błędów w wynikach. Analizowanie komentarzy jest mniej prawdopodobne niż przetwarzanie linków, ponieważ formatowanie linków jest o wiele bardziej zmienne, ale nadal jest niewiarygodne. – bobince

+7

Próbka kodu nie działa. Nie można modyfikować węzłów podczas wyliczania w kolekcji –

0

Ten działa dla mnie:

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

Ale myślę, że można użyć normalnego dokumentu XML dla XML lub inaczej HtmlAgilityPack dla HTML. Wysoce nie zaleca analizowanie znaczników za pomocą RegEx.

+2

Powinieneś umieścić nieważny kwantyfikator na swoim mnożniku, tj. '' Ten problem można rozwiązać, dodając po prostu flagę SingleLine, która modyfikuje. również zaakceptować nowe linie. –

+0

@Matthew. Tak. Zgadzam się. Teoretycznie masz rację. Ale próbowałem flagę SingleLine i nie zmienia to wyniku. Także praca nie chciwa i chciwa. Przetestowano za pomocą radsoftware.com.au/?from=RegexDesigner –

0

To jest najlepszy wynik Google do usuwania komentarzy za pośrednictwem C#, a oto mój kod HtmlAgilityPack do robienia tego.

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

To działa poprawnie w odpędzania komentarzach, a ignoruje doctype, który jest traktowany jako komentarz przez HtmlAgilityPack.

Chociaż regex działa w kontrolowanych warunkach. Jeśli przetwarzasz HTML z dzikiej sieci, polecam użycie HtmlAgilityPack. Kod HTML, który jest tam obecny, jest bardzo nieprzewidywalny, a wyrażenie regularne zostanie przerwane.

Powiązane problemy