我正在编写自己的练习缩小工具(常规表达练习),但经过一些教程后,我仍然没有得到它。
例如,我正在尝试查找并删除CSS文件中的所有注释,其中包括:
单行注释,如
/ **单行评论 * *** /或
/ * ** * 单行评论* /和
多行注释,如
/ * *** 评论开始
.myCssClass
{
font:13pt Arial;
}
的 的 ** * ** * *** 评论结束* * /
到目前为止,我使用的表达式只能处理单行注释,如下所示
(\/\*.*\*\/)
但是我正在试图理解的正则表达式是如何告诉正则表达式引擎跨越行。我试过这个:
(\/\*[.\n]*\*\/)
根本不起作用。
任何人都知道我哪里出错了?
谢谢, 雅克
答案 0 :(得分:3)
如果你在C#中运行匹配,你试过RegexOptions吗?
Match m = Regex.Match(word, pattern, RegexOptions.Multiline);
“多行模式。更改^和$的含义,使它们分别在任何行的开头和结尾匹配,而不仅仅是整个字符串的开头和结尾。”
另见Strip out C Style Multi-line Comments
修改强>
OK ..看起来像正则表达式的问题。以下是使用http://ostermiller.org/findcomment.html中的正则表达式模式的工作示例。这个人很好地得到了正则表达式,并展示了各种方法的缺陷和不足。注意:RegexOptions.Multiline / RegexOptions.Singleline似乎不会影响结果。
string input = @"this is some stuff right here
/* blah blah blah
blah blah blah
blah blah blah */ and this is more stuff /* blah */
right here.";
string pattern = @"(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)";
string output = Regex.Replace(input, pattern, string.Empty, RegexOptions.Singleline);
答案 1 :(得分:1)
与C风格的评论(以/*
开头,以*/
结尾且不嵌套)匹配的正则表达式为:
[/][*]([^*]|[*]*[^*/])*[*]+[/]
(我有一点关于这个的推导。请参阅:www.nongnu.org/txr/txr-manpage.html在目录中查找“附录A”,并且链接到“示例:匹配C语言注释“。)
C风格的评论可以在内部包含序列/*
,这样/*/**/
就是一个有效的评论。最接近的*/
会终止评论,因此/* */aaa/* */
是两条评论,aaa
介于两者之间,而不是一条评论。这种“非贪婪”行为使正则表达式语言中的匹配变得复杂,该语言没有非贪婪的运算符。