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