这个正则表达式是否足以删除C++多行注释?

Geo*_*Geo 3 c++ regex parsing

我需要解析一些C++文件,为了让事情变得更容易,我考虑删除多行注释.我尝试了以下正则表达式:/(\/\*.*?\*\/)/,使用多线修改器,它似乎工作.你认为会有任何失败的情况吗?

Chr*_*utz 10

以下是伤害你的:

std::cout << "Printing some /* source code */" << std::endl;
Run Code Online (Sandbox Code Playgroud)

这是一个很好的例子.想象一下,如果字符串开始发表评论并且没有结束,你可以做的损害?您最终可能会删除大量代码.

一个正则表达式可能会给你一个很好的"快速和肮脏"的解决方案,并可能在你的特定情况下工作(我敦促你执行一次"提取和打印所有匹配"通过"删除所有匹配"为了确保),但在一般情况下,您将需要一个更复杂的解析器.你可以用正则表达式来解释这种情况,但它会变得丑陋.

编辑:感谢评论中的@MSalters,我已经意识到你遇到的问题不仅仅涉及源文件,但严格来说,如果你使用带有嵌入式注释的宏,你会遇到麻烦.因此经过一些测试后发现,大多数机器上已经安装了一个工具,其中包含一个C++编译器,可以清除注释,并为您处理所有棘手的字符串和宏问题.使用此选项file.cpp可以获得没有注释的输出(单行或多行):

cpp file.cpp
Run Code Online (Sandbox Code Playgroud)

当然,这将扩展所有的宏和#includes,并且可能没有你想要的相同的漂亮整洁格式,但它将轻松处理与注释查找相关的所有宏,字符串和其他问题.如果您不知道,cppC预处理器是否是一个独立的可执行文件(理论上您可以使用#includes和#defines等任何语言使用相对类似C的语法),所以如果你没有它,你可以得到与GCC相同的效果如下:

gcc -E file.cpp
Run Code Online (Sandbox Code Playgroud)

(gcc改为g++如果你真的在乎 - 它可以处理#include <iostream>得更好.)

据我所知,删除注释并不是严格意义上的预处理器的一部分,但是大多数预处理器在那个阶段都是为了简化实际语言解析器的语法(嗯,GCC的预处理器就是这样做的,而且我只需要测试它).因此,如果您的编译器的预处理器选项将为您执行此操作,并且这就是您想要完成的任务,请立即停止自己的操作.

我很抱歉没有早点想到这个.我不知道它是怎么逃过我的.

  • 我先做一个提取通道,然后更换一个.看到你的例子之后,我想我最好写一个小的解析器块来处理这个问题.不应该太复杂. (3认同)

Nic*_*kis 5

另一个失败的例子:

//**** 
some code
/*
  comments
*/
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将匹配除第一个斜杠之外的所有内容.