gpt4 book ai didi

c++ - 使用 RegEx 在 C++ 中剥离多行注释

转载 作者:行者123 更新时间:2023-11-27 23:26:37 38 4
gpt4 key购买 nike

假设我有一个 var std::string sourceCode;,我在其中加载了一个 cpp 源文件。现在我想从 tr1 中删除包含正则表达式类的所有注释(现在它们已完全包含在我使用 Microsoft 编译器时)- 单行很容易,但多行则不然。这不仅仅是用空格等替换评论,而是要保持正确的行数。假设我们删除了一个 5 行长的注释,那么这个空间应该用 5 个换行符填充,以便我能够回溯代码并使用正确的行号进行计算。

到目前为止我的代码:

std::regex singleLinedCommentReg("//.*");
sourceCode = std::regex_replace(sourceCode, singleLinedCommentReg, std::string(""));
std::regex multiLinedCommentReg("(/\\*([^*]|[\r\n]|(\\*+([^*/]|[\r\n])))*\\*+/)");
std::for_each(
std::sregex_iterator(sourceCode.begin(), sourceCode.end(), multiLinedCommentReg),
std::sregex_iterator(),
[&](const std::match_results<std::string::const_iterator>& match) -> bool {
// TODO: Replace the current match with an appropriate number of newlines.
return true;
}
);

有人可以给我一些建议吗?

编辑#1

想激起关于使用 RegEx 进行这种行为是否有意义的讨论的评论!请假设输入是干净的并且符合预期。

最佳答案

您使用正则表达式的方法太复杂了。您正在尝试使用常规语言 (regex) 来解析至少与上下文无关语法一样复杂的情况。如果您将事情拆分并使用 C++ 进行部分处理,您将完成它,但它看起来会很乱。

如果您的目标是编写一个函数,在不丢失换行符的情况下去除所有注释,我建议您使用众多可用的解析工具之一生成解析。

这只花了不到 5 分钟的时间来创建,并且在功能上正是您正在寻找的。您可以根据自己的喜好修改它。它将生成一个 flex 2.5.4 或 flex 2.5.35 的词法分析器

%{
#include <stdio.h>
%}


cbeg "/*"
cend "*/"
cppc "//"
nl "\n"|"\r\n"

%option noyywrap
%x mlc
%%
{nl} { fputs(yytext, stdout); }
{cbeg} { BEGIN(mlc); }
{cend} { fprintf(stderr, "Error: found end of comment without a beginning\n"); return -1; }
{cppc}.* /* eat up the comment */
. { fputs(yytext, stdout); }

<mlc>{cend} { BEGIN(INITIAL); }
<mlc>{cbeg} { fprintf(stderr, "Error: Found /* inside another /* comment"); return -1; }
<mlc>. /* eat up everything else */

%%

int main(int argc, char* argv[])
{
yylex();
}

附录:

以上是一个功能齐全的程序。您可以使用以下方法生成 .c:

flex -t foo.l > foo.c

你可以编译它使用

cc -o foo foo.c

现在像

./foo < source.c > source-sans-comments.c 

将生成新的源文件。

关于c++ - 使用 RegEx 在 C++ 中剥离多行注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886410/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com