gpt4 book ai didi

c++ - QRegExp 用于从代码中提取单行注释

转载 作者:行者123 更新时间:2023-11-30 04:16:53 25 4
gpt4 key购买 nike

我必须从qmake 项目文件中提取单行注释。规则很简单:注释以 # 符号开头,以换行符 \n 开头。所以我阅读了一些关于 QRegExp 的文档,并编写了这样的代码来打印 qmake 文件中的所有注释:

QRegExp re ("#(.*)\n$");
re.setMinimal (true);
int comment_index = 0;
while ((comment_index = _project_contents.indexOf (comment_expr, comment_index)) != -1)
{
QString comment_text = comment_expr.cap (0);
qDebug() << "Comment 1" << comment_text;
}

但它无法正常工作 - 只是打印了项目文件的所有内容。我的错误在哪里?正如我从文档中了解到的那样,这应该可行,但事实并非如此。

附言我是正则表达式的新手,所以请不要打败我:)

最佳答案

问题是 . "matches any character (including newline)." . $ 是字符串的结尾。

您可以尝试使用非换行符 - [^\n] 并将 $ 更改为 (\n|$) (换行符或字符串结尾):

"#[^\n]*(\n|$)"

但是这会在任何地方匹配 # 而不是仅仅在一行的开头,所以让我们试试这个:

"(^|\n)#[^\n]*(\n|$)"

^ 是字符串的开始,所以基本上 (^|\n) (字符串或新行的开始)就在一行的开始之前。

你能看出问题所在吗?如果连续 2 行有 2 条评论怎么办?您将只匹配第一个,因为换行符将在匹配第一个期间被消耗(因为下一个匹配从上一个结束的地方开始)。

解决此问题的方法是使用前瞻:

"(^|\n)#[^\n]*(?=\n|$)"

这会导致结束换行符不包含在匹配中(但仍会检查),因此该位置将恰好在换行符之前,下一场比赛可以使用它。

# 前面可以加空格吗?如果是,检查零个或多个空格 (\s*):

"(^|\n)\s*#[^\n]*(?=\n|$)"

关于c++ - QRegExp 用于从代码中提取单行注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17468703/

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