正则表达式 - 删除标记

本文关键字:删除 正则表达式 | 更新日期: 2023-09-27 17:55:39

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

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

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

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

正则表达式 - 删除标记

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

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

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

例如,如果您有以下内容:

<someTag>some stuff

然后它会正常工作。

但是,如果您有此内容:

<someTag>some stuff</someTag>

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

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

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

当应该使用 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;
        }
    }
}