我遇到了需要删除以下形式注释的情况:
<!-- Foo
Bar -->
我想使用一个正则表达式来匹配起始和结束“分隔符”之间的任何内容(包括换行符)。
这个任务需要什么样的好的正则表达式呢?
无法用上下文无关文法来描述。正则表达式是基于上下文无关文法的。
假设这个线程被导出为XML格式。如果您的示例(<!-- FOO Bar -->)被包含在CDATA中,它将会丢失,而它并不完全是一个注释。
简单的方法:
Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);
Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
这里是一些完整的示例代码,用于读取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
是行不通的(这有点违反直觉)。