从XML中删除注释

3

我遇到了需要删除以下形式注释的情况:

<!--  Foo

      Bar  -->

我想使用一个正则表达式来匹配起始和结束“分隔符”之间的任何内容(包括换行符)。
这个任务需要什么样的好的正则表达式呢?
5个回答

6

无法用上下文无关文法来描述。正则表达式是基于上下文无关文法的。

假设这个线程被导出为XML格式。如果您的示例(<!-- FOO Bar -->)被包含在CDATA中,它将会丢失,而它并不完全是一个注释。


5

简单的方法:

Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);

更好的方法是:
Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);

对于我的简单测试用例,<!--(?:[^-]|-(?!->))*--> 等同于我的:<!--([\s\S]*?)-->我的有什么遗漏吗? - Charlie Salts
只有性能上的差异。根据我的测试,你的需要118步才能完成,而我的只需要62步 :) - Diadistis
我不知道 .net 的正则表达式库,但许多正则表达式编译器都针对 .*? 进行了优化,以便比朴素匹配情况更快。 - ʞɔıu

4
“正确的”方法是使用XSLT并复制除注释以外的所有内容。

我对XSLT没有太多经验 - 但这是我将来可能尝试的东西。 - Charlie Salts

0
使用正则表达式解析XML被认为是不良风格。 请使用一些XML解析库。

0

这里是一些完整的示例代码,用于读取XML文件,并返回一个字符串,该字符串是没有注释的文件。

var text = File.ReadAllText("c:\file.xml");
{ 
  const string strRegex = @"<!--(?:[^-]|-(?!->))*-->";
  const RegexOptions myRegexOptions = RegexOptions.Multiline;
  Regex myRegex = new Regex(strRegex, myRegexOptions);
  string strTargetString = text;
  const string strReplace = @""; 

  string result = myRegex.Replace(strTargetString, strReplace);
  return result;
}

不幸的是,仅使用RegexOptions.Multiline是行不通的(这有点违反直觉)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接