我必须删除标记并将所有其他信息保存在XML文件中。在使用正则表达式时,我有点不知所措。我只能逐行读取文件然后尝试“找到”所有标签并用“”替换它们 - 空字符串。但是,它没有按预期工作:
line = Regex.Replace(line, "<.*>", "");
我能否解释为什么这不能按预期工作(我认为它应该只是找到所有可能的符号组合在&lt;&gt;里面。另外,你能不能推荐正则表达式的一个很好的介绍。我在regular-expressions.info上阅读了很多内容,但我发现它有点不完整和令人困惑。
答案 0 :(得分:7)
你应该使*量词延迟,以便它与下一个&gt;匹配而不是最后一个:
line = Regex.Replace(line, "<.*?>", "");
答案 1 :(得分:2)
除了尝试使用正则表达式解析XML是徒劳的(其他人无疑会发布该链接),您的问题是*
贪婪。它会在您文档中的第一个<
和最后一个>
之间尽可能多地匹配。
例如,如果你有这个:
<someTag>some stuff
然后它会正常工作。
但是如果你有这个:
<someTag>some stuff</someTag>
然后它将匹配第一个<
和最后一个>
,从而删除标记之间的内容。
一个解决方案,正如BlackBear建议的那样,将?
添加到*
以使其非贪婪。这样它将匹配可能的最小匹配而不是最大匹配。
但I4V评论的更好的解决方案是使用XML解析器来解析XML。
答案 2 :(得分: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;
}
}
}