我有以下两种情况:
int test(asdf1234, 245234)
virutal void TEST::test(asdf1234, 123)
我想从两个函数中获取函数名“test”。
我知道我可以使用以下方法实现这一目标:
QRegExp regex("...some regex...");
regex.indexIn(str);
foreach (QString part, regex.capturedTexts()) {
qDebug() << part;
}
但是我在解决如何构造正则表达式方面遇到了问题。
有什么想法吗?
答案 0 :(得分:0)
(::|\s+)(.+)\(
应该可行。以上翻译为:两个冒号或一些空格,后跟一个或多个字符,然后是一个左括号。
注意,在c ++中编写上述任一语句时,必须转义RegularExpression中的反斜杠。所以第一个陈述看起来像:
QRegExp regex("::(.+)\\(");
如果您想进行实验并更好地学习RegEx,我会查看http://regexr.com/。
出来的捕获组将显示捕获的所有内容,然后显示表达式中包含在parens中的内容。在这种情况下,(.+)
是唯一的一组parens,因此它将是捕获组1。
如果您想要真正想要的是,尝试只获取有效的c++ standard names函数并且不小心选择9asdf%$#
作为函数名称,您可以使用:
([A-Za-z_][A-Za-z_\d]+)
(::|\s+)([A-Za-z_][A-Za-z_\d]*)\s*\(
或者,如果您想要对这两种类型的函数调用非常具体,可以执行以下操作:
((virutal void [A-Za-z_][A-Za-z_\d]*::)|(int\s+))([A-Za-z_][A-Za-z_\d]+)\s*\(
其转换为:找到短语virtual void _____::
或int
以及其后的一些词,然后是一些可选的空格,然后是一个开放的parethesis。
您要寻找的捕获组可能是:4,因为计算左括号。
同样对于QRegExp,如果你想让*或+成为贪婪的算子,你必须使用setMinimal(false);
http://doc.qt.io/qt-5/qregexp.html#setMinimal
另请务必查看:
http://doc.qt.io/qt-5/qregularexpression.html
QRegularExpression
类似,但与QRegExp
相比有一些优势。 QRegExp
有点老了,可能有更多的例子。
希望有所帮助。