正则表达式 - 删除标签 [重复]
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解析器? 您到底想留下什么?除了<
和>
之外的所有内容?留下属性?留下 CDATA 和 XText?
从 XML 文件中删除 <>
?有些东西告诉我你不是最佳方法。
你来了,伙计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 是徒劳的(其他人无疑会发布该链接)之外,您的问题是 *
是 贪婪。它将尽可能匹配文档中的第一个 <
和最后一个 >
。
例如,如果你有这个:
<someTag>some stuff
然后就可以正常使用了。
但是,如果你有这个:
<someTag>some stuff</someTag>
然后它将匹配第一个<
和最后一个>
,从而删除标签之间的内容。
正如 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 的类似方法)除了知道正则表达式不适用于此类问题之外,几乎不需要付出任何努力。以上是关于正则表达式 - 删除标签 [重复]的主要内容,如果未能解决你的问题,请参考以下文章