QRegExp解析函数名称

时间:2015-03-06 20:22:01

标签: c++ regex qt

我有以下两种情况:

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

但是我在解决如何构造正则表达式方面遇到了问题。

有什么想法吗?

1 个答案:

答案 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有点老了,可能有更多的例子。

希望有所帮助。