正则表达式 - 删除标签

时间:2013-01-23 18:11:54

标签: c# regex

  

可能重复:
  Using C# regular expressions to remove HTML tags

我必须删除标记并将所有其他信息保存在XML文件中。在使用正则表达式时,我有点不知所措。我只能逐行读取文件然后尝试“找到”所有标签并用“”替换它们 - 空字符串。但是,它没有按预期工作:

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

我能否解释为什么这不能按预期工作(我认为它应该只是找到所有可能的符号组合在&lt;&gt;里面。另外,你能不能推荐正则表达式的一个很好的介绍。我在regular-expressions.info上阅读了很多内容,但我发现它有点不完整和令人困惑。

3 个答案:

答案 0 :(得分:7)

你应该使*量词延迟,以便它与下一个&gt;匹配而不是最后一个:

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

答案 1 :(得分:2)

除了尝试使用正则表达式解析XML是徒劳的(其他人无疑会发布该链接),您的问题是* 贪婪。它会在您文档中的第一个<和最后一个>之间尽可能多地匹配。

例如,如果你有这个:

<someTag>some stuff

然后它会正常工作。

但是如果你有这个:

<someTag>some stuff</someTag>

然后它将匹配第一个<和最后一个>,从而删除标记之间的内容。

一个解决方案,正如BlackBear建议的那样,将?添加到*以使其非贪婪。这样它将匹配可能的最小匹配而不是最大匹配。

但I4V评论的更好的解决方案是使用XML解析器来解析XML。

答案 2 :(得分: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;
        }
    }
}