使用QT的正则表达式库提取c++函数声明和函数定义

本文介绍如何使用QT的正则表达式库,详细讲解了提取C++函数声明和函数定义的方法,包括正则表达式的使用和非贪婪匹配的概念。并给出了在QT中实现的具体代码示例。
摘要由CSDN通过智能技术生成

使用QT的正则表达式库提取c++函数声明和函数定义

提取函数声明的正则表达式比较简单,这里介绍一下自己偶然间想到的提取函数定义方法。有正则经验的可以直接看代码

一、提取函数声明

一个普通函数的声明通常由 返回类型 函数名(参数列表) 组成
但是在不同情况下,可以把正则表达式写成下面这些形式:

1.从函数定义中提取:如 void getName(){  }
(\\b[A-Za-z0-9_]+\\s+\\b[A-Za-z0-9_]+\\s*\\(.*?\\))(?=\\s*\\{)
2.从函数声明中提取:如 void getName();
(\\b[A-Za-z0-9_]+\\s+\\b[A-Za-z0-9_]+\\s*\\([^){]*?\\))(?=\\s*\\;)

以第一种情况为例
1.其中\b表示单词边界(在这里就是 返回值或函数名 的边界),\s表示空白字符(空格换行等)。两个\是因为在c++中\要进行转义)
2.[A-Za-z0-9_]表示 合法的返回值类型或函数名,+表示前面的字符出现一次或多次
3.将前半部分括住的括号表示捕获括号,即要提取的部分
4.再后面的(?=\\s*\\{)的基本形式是(?=E),官方解释叫Positive lookahead,表示前面那个括号后面接着的字符串的形式是正则表达式E表示的形式。函数声明之后往往是花括号括起来的函数,但在花括号之前可能还会有空白字符(包括空格、换行\r\n等)所以在此之前,所以我们要加上\\s*表示零个或多个空白字符。后面再跟着一个{
5.在qt中,其正则表达式要写成这样:
(\\b[A-Za-z0-9_]+\\s+\\b[A-Za-z0-9_]+\\s*\\(.*\\))(?=\\s*\\{)相比原来的少了一个?号,?表示非贪婪捕获,即匹配符合条件的、尽可能少的字符。此文针对qt代码时,没有采取这种写法(因为我写了之后反而不能正常提取了,不知道是不是qt中不支持这种写法),但我在生成QRegExp对象后调用了QRegExp对象的setMinimal(true)函数设置了非贪婪的特性,能达到同样的效果(见下文)

在QT中提取函数声明的代码:

#include<QRegExp>
#include<QString>
#include<QDebug>

//这里以第一种情况为例,即即将提取的代码中是类似void getName(){  }格式的函数定义
QStringList get_fun_name_list(QString source_code){
    //源代码,将要进行捕获的代码赋给source_code
	QRegExp capFunDeclare("(\\b[A-Za-z0-9_]+\\s+\\b[A-Za-z0-9_]+\\s*\\(.*?\\))(?=\\s*\\{)");
	//设置非贪婪特性
	capFunDeclare
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值