2013-01-23 136 views
-2

可能重複:
Using C# regular expressions to remove HTML tags正則表達式 - 刪除標記

我不得不刪除標記,並保持在一個XML文件中的所有其他信息。使用正則表達式時,我有點不知所措。我只能想出一行一行的讀取文件,然後嘗試「定位」所有標籤,並用「」 - 空字符串替換它們。但是,它不按預期工作:

line = Regex.Replace(line, "<.*>", ""); 

我能請得到一個解釋這是爲什麼不按預期工作(我認爲這應該只是找到其內部<>另外,可以符號的所有可能的組合。你應該推薦一個很好的正則表達式的介紹,我在regular-expressions.info上看了很多,但是我發現它在某種程度上是不完整和令人困惑的。

+3

爲什麼不使用xml解析器? – I4V

+1

你究竟想要留下什麼?除了'<' and '>'以外的所有東西?留下屬性?留下CDATA和XText? – user7116

+0

從XML文件中刪除'<>'?有些事情告訴我你並沒有採用最佳方法。 –

回答

6

你應該讓*量詞懶惰,以便它匹配next>而不是最後一個:

line = Regex.Replace(line, "<.*?>", ""); 
2

除了嘗試用正則表達式解析XML(其他人無疑會發布該鏈接),您的問題是*貪婪。它將盡可能匹配文檔中的第一個<和最後一個>

舉例來說,如果你有這樣的:

<someTag>some stuff 

然後,它會正常工作。

不過,如果你有這樣的:

<someTag>some stuff</someTag> 

然後,它會匹配第一個<最後>,因此刪除標記之間的內容。

一個解決方案,因爲BlackBear建議是爲了使非貪婪添加?*。這樣它將匹配可能的最小匹配而不是最大匹配。

但是更好的解決方案,正如I4V所評論的那樣,是使用XML解析器來解析XML。

1

爲什麼要在正則表達式中使用XML解析器時浪費時間?

using (var reader = XmlReader.Create("file.xml")) 
{ 
    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
     case XmlNodeType.Text: 
     case XmlNodeType.CDATA: 
     case XmlNodeType.EntityReference: 
     case XmlNodeType.Whitespace: 
     case XmlNodeType.SignificantWhitespace: 
      Console.Write("{0}", reader.ReadContentAsString()); 
      break; 
     } 
    } 
} 
+0

爲什麼浪費時間用這樣複雜的代碼,當你可以用簡單的單行事物來完成時? ;) – BlackBear

+0

@BlackBear:因爲正則表達式對這些問題是一個懶惰的,通常不正確的「解決方案」。對於跨越多行的XML元素,所有當前答案都會失敗。 – user7116

+0

是的,同意這一點,只是在開玩笑;)但是使用完整的XML解析器可能是一種矯枉過正,它取決於你想要做什麼 – BlackBear