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

标签 c++ regex parsing

我需要解析一些 C++ 文件,为了让事情更简单,我考虑删除多行注释。我尝试了以下正则表达式:/(\/\*.*?\*\/)/,使用多行修饰符,它似乎有效。你认为它会不会失败?

最佳答案

以下内容会伤害您:

std::cout << "Printing some /* source code */" << std::endl;

这是一个很好的例子。想象一下,如果字符串开始注释但没有结束注释,您会造成多大的损失?您最终可能会删除大量代码。

正则表达式可能会给你一个很好的“快速而肮脏”的解决方案,并且可能适用于你的特定情况(我敦促你在执行一次“删除”之前执行一次“提取并打印所有匹配项”所有匹配”以确保),但在一般情况下,您将需要一个更复杂的解析器。您也许可以使用正则表达式来解释这种情况,但它会变得很丑陋。

编辑:感谢评论中的@MSalters,我意识到您所遇到的问题不仅仅涉及源文件,但严格来说,如果您使用带有嵌入式评论的宏,那么您就是在自找麻烦。所以经过一些测试后,事实证明大多数机器上已经安装了一个工具,带有 C++ 编译器,可以清除注释,并为您处理所有挑剔的字符串和宏问题。在 file.cpp 上使用它获取不带注释的输出(单行或多行):

cpp file.cpp

当然,这将展开所有宏和 #include s,并且可能没有您想要的那种漂亮整洁的格式,但它可以轻松处理所有宏、字符串和其他与评论查找相关的问题。如果你不知道,cpp是作为独立可执行文件的 C 预处理器(理论上你可以使用 #include s 和 #define s 等​​在任何具有相对 C 语法的语言中),所以如果你没有它,你可以得到相同的像这样使用 GCC 的效果:

gcc -E file.cpp

(将 gcc 更改为 g++ 如果您真的关心 - 它可能会更好地处理 #include <iostream>。)

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

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

关于c++ - 这个正则表达式是否足以删除 C++ 多行注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577621/

相关文章:

c++ - 为什么我的峰度是负数?

c++ - 二叉堆的高效实现

c++ - 在 C++ 中使用 QThread 多线程编程

c++ - 使用 OpenCV 进行多色物体检测

java - 当行包含双引号时如何捕获行尾?

正则表达式允许数字和一个点

Python 和 RegEx 从未格式化的文本文件中查找演讲者及其演讲?

计算并解析 html 文件中的所有 href 链接

python - 如何在 Python 中使用 Beautifulsoup 从 HTML 中提取标签

android - 解析数据时出错 org.json.JSONException : Value <br of type java. lang.String 无法转换为 JSONObject