我遇到了删除表单注释的需要:
<!-- Foo
Bar -->
我想使用一个正则表达式来匹配开头和结尾“分隔符”之间的任何内容(包括换行符)。
这个任务的一个好的正则表达式是什么?
没有任何。它不能用正则表达式所基于的上下文无关文法来描述。
假设这个线程以 XML 格式导出。如果包含在 CDATA 中,您的示例 (<!-- FOO Bar -->) 将丢失,但它并不完全是注释。
简单的方法:
Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);
还有一个更好的方法:
Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
“正确”的方法是使用 XSLT 并复制除注释之外的所有内容。
使用正则表达式解析 XML 被认为是不好的风格。使用一些 XML 解析库。
这是一些完整的示例代码,用于读取 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).