用于从代码中提取单行注释的QRegExp

QRegExp for extracting single line comments from code

本文关键字:单行注释 QRegExp 提取 代码 用于      更新时间:2023-10-16

我必须从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;
}

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

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

问题是."匹配任何字符(包括换行符)。"。而$是字符串的末尾。

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

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

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

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

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

你能看到那里有问题吗?如果你连续两行有两条评论怎么办?您将只匹配第一个,因为新行将在匹配第一个时被消耗(因为下一个匹配从上一个匹配完成的地方开始)。

解决方法是使用前瞻:

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

这会导致匹配中不包括结束换行符(但它仍然被选中),因此位置将刚好在换行符之前,下一个匹配可以使用它。

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

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