正则表达式 - 删除标记
本文关键字:删除 正则表达式 | 更新日期: 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;
}
}
}