1

我正在编写自己的练习缩小工具(正则表达式练习),但经过一些教程后,我仍然没有得到它。

例如,我试图从我的 CSS 文件中查找并删除所有注释,其中包括:

  1. 单行注释,如

    /** 单行注释* *** / 或

    / * ** *单行注释 * / 和

  2. 多行注释,如

    / * ***开始评论

    .myCssClass

    {

    font:13pt Arial;
    

    }

** * ** * ***评论结束 * */

到目前为止,我使用的表达式只能处理单行注释,如下所示

(\/\*.*\*\/)

但是我想了解的正则表达式是如何告诉正则表达式引擎也跨行。我确实试过这个:

(\/\*[.\n]*\*\/)

这根本不起作用。

有人知道我要去哪里错了吗?

谢谢, 雅克

4

2 回答 2

3

如果您在 C# 中运行比赛,您是否尝试过 RegexOptions?

Match m = Regex.Match(word, pattern, RegexOptions.Multiline);

“多行模式。更改 ^ 和 $ 的含义,以便它们分别匹配任何行的开头和结尾,而不仅仅是整个字符串的开头和结尾。”

另请参阅去除 C 样式多行注释

编辑:

好的..看起来像正则表达式的问题。这是一个使用来自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);
于 2012-05-11T15:44:53.477 回答
2

匹配 C 风格注释(以 开头/*、以 结尾*/且不嵌套)的正则表达式是:

[/][*]([^*]|[*]*[^*/])*[*]+[/]

(关于这个的推导,我写了一点。见:www.nongnu.org/txr/txr-manpage.html 在目录中查找“附录A”,有一个链接到“示例:匹配C 语言注释”。)

C-style comments can include the sequence /* in the interior, such that /*/**/ is a valid comment. The closest */ terminates the comment so that /* */aaa/* */ is two comments with aaa in between, not one comment. This "non-greedy" behavior complicates the matching in a regex language which has no non-greedy operator.

于 2012-05-11T17:03:14.843 回答