3

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

<!--  Foo

      Bar  -->

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

这个任务的一个好的正则表达式是什么?

4

5 回答 5

6

没有任何。它不能用正则表达式所基于的上下文无关文法来描述。

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

于 2008-12-28T05:39:13.157 回答
5

简单的方法:

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

还有一个更好的方法:

Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
于 2008-12-28T05:36:05.987 回答
4

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

于 2008-12-28T07:06:31.593 回答
0

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

于 2008-12-28T18:04:47.160 回答
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;
}

Unfortunately, RegexOptions.Multiline alone will not do the trick (which is slightly counterintuitive).

于 2013-11-08T13:09:08.553 回答