-1

可能重复:
使用 C# 正则表达式删除 HTML 标记

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

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

我能否解释一下为什么这不能按预期工作(我认为它应该只找到 <> 内所有可能的符号组合。另外,你能否推荐一个好的正则表达式介绍。我在常规上读了很多-expressions.info 但我发现它不完整且令人困惑。

4

3 回答 3

7

您应该使 * 量词惰性,以便它匹配下一个 > 而不是最后一个:

line = Regex.Replace(line, "<.*?>", "");
于 2013-01-23T18:13:32.473 回答
2

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

例如,如果你有这个:

<someTag>some stuff

然后它会正常工作。

但是,如果你有这个:

<someTag>some stuff</someTag>

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

正如 BlackBear 建议的那样,一种解决方案是添加?to*以使其成为non-greedy。这样,它将匹配可能的最小匹配而不是最大匹配。

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

于 2013-01-23T18:14:25.527 回答
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;
        }
    }
}
于 2013-01-23T18:24:00.960 回答