加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式匹配(c/c++)非注释部分

发布时间:2020-12-14 02:04:50 所属栏目:百科 来源:网络整理
导读:最近在写一个C++的parser,里面有一个功能是要解析出所有有效的头文件。如有文件片段如下: #include QObject#include QStringList#include QVariant#include QMap#include QVariantMap#include QVariantList/* #include aaa.h *//*#include aaa.h *//* #inc

最近在写一个C++的parser,里面有一个功能是要解析出所有有效的头文件。如有文件片段如下:

#include <QObject>
#include <QStringList>
#include <QVariant>
#include <QMap>
#include <QVariantMap>
#include <QVariantList>

/* #include <aaa.h> */
/*#include <aaa.h> */
/* #include <aaa.h>*/
/*#include <aaa.h>*/

#include <test>

/*
 #include <aaa.h> */

/* #include <aaa.h> 
*/

/* 
#include <aaa.h> 
*/

/* 
	#include <aaa.h> 
*/

// #include <aaa.h> 
  // #include <aaa.h> 
	// #include <aaa.h> 


需要从中检索出QObject,QStringList,QVariant,QMap,QVariantMap,QVariantList,test这几个有效的头文件(去除注释掉的)。

要完成这样的检索我们有很多方法,正则表达式是一种比相对比较便捷的方法。在这里要匹配的头文件要去除注释掉的部分,实质上也就是把前面是/*或者//的情况过滤掉。对应在正则表达式中我们可以使用负前后查找(负零宽度断言)来实现。表达式如下:

(?<!(s*/*s*)|(s*//s*))#includes*[<"]+([w+.h]+)[">]*(?!s**/s*)

匹配结果如下图:


可以看到这个正则是符合需求的。只是看这正则起来略复杂,别慌我们慢慢来分析这个正则的原理。

在这里我假设读者已经有基本的正则知识,如果没有的话,建议看一下<<正则表达式30分钟入门教程>>其实我也只是有基本的知识而已。下面开始讲主要内容

这一段(?<!(s*/*s*)|(s*//s*))#includes*[<"]+([w+.h]+)[">]*(?!s**/s*)可以分成三个部分来看。

第一部分(?<!(s*/*s*)|(s*//s*))

第二部分#includes*[<"]+([w+.h]+)[">]*

第三部分(?!s**/s*)

第一部分其实负向后查找,查找前面部分不匹配/* 或//的情况,这里?<!是负向后查找的标识,后面跟着一串表达式(s*/*s*)|(s*//s*),在表达式中|分割了两种情况|左边部分s*/*s*表示匹配/*的情况,右边部分s*//s*表示匹配//的情况。于是乎这个部分表达的就是不匹配开头为/*或者//的情况。

第二部分是匹配形如#include <sss> #include "xxx"这样的句式,这里比较简单就不再细说。

而第三部分则是负向前查找,这部分主要是排除*/的匹配。其实这部分不是必须的,因为,/**/总是匹配的。所以即便去掉看样子还可以得到正确的结果的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读