Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个正则表达式是否足以删除C++;多行注释? 我需要解析一些C++文件,为了让事情更容易,我想删除多行注释。我尝试了下面的正则表达式:/(\/\*.*?\*\/)/,使用了多行修饰符,它似乎可以工作。你认为它会失败吗?_C++_Regex_Parsing - Fatal编程技术网

这个正则表达式是否足以删除C++;多行注释? 我需要解析一些C++文件,为了让事情更容易,我想删除多行注释。我尝试了下面的正则表达式:/(\/\*.*?\*\/)/,使用了多行修饰符,它似乎可以工作。你认为它会失败吗?

这个正则表达式是否足以删除C++;多行注释? 我需要解析一些C++文件,为了让事情更容易,我想删除多行注释。我尝试了下面的正则表达式:/(\/\*.*?\*\/)/,使用了多行修饰符,它似乎可以工作。你认为它会失败吗?,c++,regex,parsing,C++,Regex,Parsing,以下几点会伤害你: std::cout << "Printing some /* source code */" << std::endl; 当然,这将扩展所有宏和#includes,并且可能没有您想要的相同的整洁格式,但它将轻松处理所有宏、字符串和与注释查找相关的其他问题。如果您不知道,cpp是作为独立可执行文件的C预处理器(理论上,您可以使用#includes和#defines等任何具有类似C语法的语言),因此如果您没有它,您可以通过GCC获得如下效果: gcc -

以下几点会伤害你:

std::cout << "Printing some /* source code */" << std::endl;
当然,这将扩展所有宏和#includes,并且可能没有您想要的相同的整洁格式,但它将轻松处理所有宏、字符串和与注释查找相关的其他问题。如果您不知道,
cpp
是作为独立可执行文件的C预处理器(理论上,您可以使用
#include
s和
#define
s等任何具有类似C语法的语言),因此如果您没有它,您可以通过GCC获得如下效果:

gcc -E file.cpp
(如果您真的在意,请将
gcc
更改为
g++
——它可以更好地处理
#include
。)

据我所知,删除注释严格来说不是预处理器的一部分,但大多数预处理器在该阶段这样做是为了简化实际语言解析器的语法(好吧,GCC的预处理器就是这样做的,这就是我要测试的全部)。因此,如果您的编译器的预处理器选项将为您完成此操作,并且这是您想要完成的全部操作,请立即停止运行自己的预处理器选项


我很抱歉没有早点想到这一点。我不知道它是怎么逃掉的。

另一个失败的例子:

//**** 
some code
/*
  comments
*/

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

正则表达式不能这样做。它就是不能。如果看不到您所写的内容,很难说它是否正确处理了所有角落的案例,但我的直接猜测是:“可能不会。”

举几个例子,请考虑

// This is a single line\
comment
行拼接仍然发生在注释内部。还请记住,可以从三角图创建延续直线的反斜杠:

// This is also a single-line??/
comment
您还必须确保不要试图解析预处理器语句,否则可能会遇到麻烦。例如,这可能是为了包括指定目录中的所有标题:

#include <all_headers/*>
#包括
但如果你处理不当,你会删除所有内容直到下一条评论结束

当然,为了保持有趣,也可以从三角图或有向图创建:

%:include <all_headers/*>
%:包括
甚至是有向图和三角图的组合:

%:include<all_headers??/*>
%:包括
解析trigraph后,它根本不包含注释分隔符,相当于:

#include <all_headers\*>
#包括

不尝试恢复旧线程,但如果我遇到它,嘿!作为对@Chris Lutz的g++方法更具体的回答:

g++ -fpreprocessed -E -P MyProgram.cpp -o NoComments.cpp

这将简单地删除注释并更改空白,将新代码发送到“NoComments.cpp”,而不使用所有其他crud。

始终是一样的:不要使用正则表达式解析语言。不要,你不能用预处理器吗?是的,它不仅仅是删除注释,但如果你同意的话……我如何使用预处理器删除注释?@Geo-许多预处理器都会删除注释,因为在该阶段删除注释比保留注释更容易,并随语言语法一起处理注释。我不知道为什么我以前没有想到这一点,我也不知道为什么我在更新我的答案之前没有阅读@sbi对同样事情的建议。可以合理地假设,我们可以(在某种程度上安全地)在解析多行注释之前去掉单行注释(尽管看起来更容易的任务也会落入字符串陷阱),在这种情况下,结果可能是好的。但是+1是一个很好的接球。我先做了一个抽射传球,然后换了一个。在看过您的示例之后,我认为最好编写一个小的解析器块来处理这个问题。应该不会太复杂。至少尝试提取测试通过,看看会出现什么样的数据,这不是不合理的。但从长远来看,解析器将是一个更好的解决方案。如果你把它设计成一个过滤器,它采用C++代码,并把无注释的C++代码吐出来,它真正需要识别的就是字符串和注释。但谁知道这些消息来源将来会如何出现。@Chris Lutz:不知道。您还需要解析include文件。由于宏可以生成字符串,所以也需要处理这些字符串。对于调试和NDEBUG并行构建@MSalters——幸运的是,我们不必编写自己的预处理器,因为有很多方法可以让编译器为我们做预处理,这使它变得非常简单。当然,无论是
cpp
还是
gcc-E-
还是
g++-E-
都会删除注释作为预处理步骤的一部分,因此OP真正需要的可能不是编写我们自己的解析器,而是检查预处理器吐出的代码。
g++ -fpreprocessed -E -P MyProgram.cpp -o NoComments.cpp