正则表达式删除多行注释

Posted

技术标签:

【中文标题】正则表达式删除多行注释【英文标题】:REGEX to remove multiline comments 【发布时间】:2014-03-18 11:09:23 【问题描述】:

我已经搜索了很多,到目前为止我创建的与多行 c cmets 匹配的最好的是:

\/\*(.|\n)*\*\/

但是对于这样的文本:

1. Not a comment
2.
3.Ooops Not a comment /**** A multiline comment **/  Ooops Not a comment
4. Ooops Not a comment /**** A multiline comment **\/
5.  ******  Ooops Not a comment
6.  ***/
7.// A another comment
8.Another not a comment
9.
10. "/*Again not a comment*/"
11.// A line comment at the end of file

The outcome looks like this: 

1. Not a comment
2.
3.Ooops Not a comment "
11.// A line comment at the end of file

有人可以解释我的错误并给我正确的吗?谢谢!

完整代码: [剧透]

%option noyywrap
%
#include <stdio.h>
#include <stdlib.h>
FILE *fout;
%

%%
\/\*(.|\n)*?\*\/
%%
void main( int argc, char ** argv)

    if ( argc < 3 )
    
        printf("\nError!!! Missing Command line arguments");
        printf("\nUsage exe <inputfile> <outputfile>");
        exit(1);
    
    else
    
        fout = fopen(argv[2],"w");
        yyout = fout;
        yyin = fopen(argv[1],"r");
        yylex();
    
    system("pause");

[/剧透]

【问题讨论】:

重复。见:Improving/Fixing a Regex for C style block comments 【参考方案1】:

尝试添加? 使其不贪婪:\/\*(.|\n)*?\*\/

匹配:

    /**** A multiline comment **/ /**** A multiline comment **\/ 5. ****** Ooops Not a comment 6. ***/ /*Again not a comment*/

如果这些匹配不正确,请更好地解释应该匹配什么。

【讨论】:

感谢您的宝贵时间 :) 。没有任何改变,tt给了我同样的结果。顺便说一句,这是我第一次看到放一个?在 * 之后。 是的,tenub 这些正是我希望它匹配的,但由于某种原因它不匹配:/ 改成/\*(.|[\r\n])*?\*/怎么样?正斜杠不一定需要转义,除非它是您的 RegEx 分隔符。 我在在线正则表达式测试器上尝试了您的表达 \/*(.|\n)*?*\/ 并且它是正确的。也许正则表达式在不同的情况下是不同的?我正在使用 Visual Studio 2008(flex 和 bison),我在 .l 文件上运行它们(我必须使用这种方式,因为这就是教授的要求)。 /*(.|[\r\n]) *?*/ 给出 Error 1 错误 PRJ0019: A tool returned an error code from "Generating lexical analyser..." Project3 Project3 您正在运行什么完整代码来实现此 RegEx 并返回匹配项?您可以编辑原始问题以包含此代码吗?

以上是关于正则表达式删除多行注释的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式删除注释

使用正则表达式删除注释

使用正则表达式删除注释

Python 3 正则表达式查找多行注释

正则表达式去除 phpdoc 多行注释

使用正则表达式匹配 Lua 多行字符串和注释