用于从代码中提取单行注释的QRegExp
QRegExp for extracting single line comments from code
我必须从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|$)"
相关文章:
- QAbstractTableModel,并为单行发出dataChanged
- Visual Studio 2019:插入多个C++风格的单行注释
- VSCode 中带有 C/C++ 扩展名的多行注释缩进错误
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 单行函数模板 c++ 的内联性保证
- 如果我注释掉换行符,为什么'string'会成为一个不合格的变量
- 当输入在带有空格的单行中给出时,cin 如何在 while 循环中工作?
- C++模板是否有助于定义单行'property'成员?
- 如何在单行语句中C++递减多个变量?
- 为什么 ## aka 令牌粘贴运算符不适用于 C 和 C++ 中的注释?
- 在 // C++注释中使用 \\ 是否合法?(C++评论中的LaTeX方程)
- 单行初始化映射中的C++对象
- 注释一行使代码工作,而没有它,代码不起作用
- Visual Studio 2017 是否有用于创建单行注释的特定键盘组合?
- Qt语法高亮显示单行注释的高亮显示规则示例
- 用于从代码中提取单行注释的QRegExp
- c++单行注释后面跟着多行注释中的变换
- Clang:在单行注释中以空格分隔的反斜杠和换行符
- 使用QRegExp忽略行中注释的非贪婪条件