我遇到了删除表单注释的需要:
<!-- Foo
Bar -->
我想使用一个正则表达式来匹配开头和结尾'分隔符之间的任何东西(包括换行符)。
这项任务有什么好的正则表达式?
答案 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
单独不会做的伎俩(这有点违反直觉)。