1

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;
}

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

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

4

1 回答 1

2

问题是. “匹配任何字符(包括换行符)”。. 是$字符串的结尾。

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

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

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

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

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

你能看出那里有问题吗?如果您连续 2 行有 2 条评论怎么办?您只会匹配第一个,因为在匹配第一个时会消耗换行符(因为下一个匹配从前一个匹配开始的地方开始)。

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

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

这会导致结尾换行符不包含在匹配项中(但仍会检查),因此该位置将位于换行符之前,并且下一个匹配项可以使用它。

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

"(^|\n)\s*#[^\n]*(?=\n|$)"
于 2013-07-04T11:18:23.363 回答