2013-01-23 138 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