正则表达式 - 删除标签 [重复]

Posted

技术标签:

【中文标题】正则表达式 - 删除标签 [重复]【英文标题】:Regular expressions - remove the tags [duplicate] 【发布时间】:2013-01-07 07:57:26 【问题描述】:

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

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

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

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

【问题讨论】:

为什么不用xml解析器? 您到底想留下什么?除了&lt;&gt; 之外的所有内容?留下属性?留下 CDATA 和 XText? 从 XML 文件中删除 &lt;&gt;?有些东西告诉我你不是最佳方法。 你来了,伙计I need to Pound a nail, do I use a glass bottle or an old shoe?。 . . tl;博士,这不是这样做的方法,使用 Xml 解析器并输出具有合理布局的新文件(如果这是在单独的行上包含所有属性和节点值,则继续使用它) 必填***.com/a/1732454/284111 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

例如,如果你有这个:

<someTag>some stuff

然后就可以正常使用了。

但是,如果你有这个:

<someTag>some stuff</someTag>

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

既然可以用一个简单的单行代码来完成,为什么还要浪费时间来处理如此复杂的代码呢? ;) @BlackBear:因为正则表达式对于这些问题是一种懒惰且通常不正确的“解决方案”。对于跨多行的 XML 元素,所有当前答案都将失败。 是的,同意这一点,只是在开玩笑 ;) 但是使用完整的 XML 解析器可能有点矫枉过正,这取决于你想做什么 他们更可能需要 XSLT,并且上述方法(或使用 Xlinq 的类似方法)除了知道正则表达式不适用于此类问题之外,几乎不需要付出任何努力。

以上是关于正则表达式 - 删除标签 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除正则表达式中的 Html 标签 [重复]

从字符串中删除 HTML 标记的正则表达式 [重复]

想要删除任何 HTML 标签 [重复]

正则表达式 Python - 反斜杠 [重复]

通过正则表达式在c#中打开html标签[重复]

删除 HTML 标签的正则表达式