从XML中删除注释

时间:2008-12-28 05:29:51

标签: .net regex comments strip

我遇到了删除表单注释的需要:

<!--  Foo

      Bar  -->

我想使用一个正则表达式来匹配开头和结尾'分隔符之间的任何东西(包括换行符)。

这项任务有什么好的正则表达式?

5 个答案:

答案 0 :(得分:6)

NONE。它不能用正则表达式所基于的上下文无关语法来描述。

假设此线程以XML格式导出。您的示例(&lt;! - FOO Bar - &gt;),如果包含在CDATA中,将会丢失,但它不完全是评论。

答案 1 :(得分:5)

简单的方法:

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

更好的方法:

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

使用正则表达式解析XML被认为是糟糕的风格。 使用一些XML解析库。

答案 4 :(得分: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单独不会做的伎俩(这有点违反直觉)。