最近在写一个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*))\#include\s*[<"]+([\w+\.h]+)[">]*(?!\s*\*/\s*)

匹配结果如下图:


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

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

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

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

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

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

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

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

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

正则表达式匹配(c/c++)非注释部分的更多相关文章

  1. swift tableview cell自适应高度

    自适应高度达到的效果实现方法:1.xcode新建个项目,选择singleViewApplication2.打开main.storyboard将tableview拖到viewcontroller中,并给tableview拖入tableviewcell3.给tableviewcell拖入imageview、label等控件4.给控件添加autoLayout约束选中“控件Imageview或Label”

  2. swift 中cell 自适应label高度

    自适应高度达到的效果实现方法:xcode新建个项目,选择singleViewApplication打开main.storyboard将tableview拖到viewcontroller中,并给tableview拖入tableviewcell给tableviewcell拖入imageview、label等控件给控件添加autoLayout约束选中“控件Imageview或Label”,选择Edito

  3. Swift语言和其他计算机语言的比较

    Swift集成了传统面向对象编程语言的特性,同时又具备函数式编程的一些特征。在2014年WWDC之前,用来开发iOS应用的语言被称为Objective-C,它是标准C语言的扩展。使用Objective-C可以完成C语言所能完成的任何工作。这里不得不提到C++语言,事实上C++和Objective-C语言几乎是同时出现的。和Objective-C语言的简洁不同,C++语言几乎包含了所有可能的特性。

  4. Swift Name Mangling - Swift语言的名字重整技术

    在比如C这样的语言中,任何给定的名字(符号)只能对应唯一的一个函数或数据,不需要名字重整。因此,c++编译器使用一组严格的编码规则“mangles”(重整)了符号。想获取更多的关于经典C++编译器重整名字的内容,请参考ItaniumC++ABIdocumentation.总结:Object-C类似于C语言,Swift类似于C++,有函数重载,有虚函数表,需要命名重整。

  5. 你是如何评价Swift的,谈谈你的感受!

    假如之前已经掌握了Objective-C,切换到Swift也不难。Swift还没有很好地解决好跟C和C++混编的问题。随着时间推移,Swift在整个iOS/Mac工程中占的代码比例会越来越多,而Objective-C作为粘合层还是会存在。只是等你真正使用Swift编写一两个项目,就回不了头。Swift有些简便快速的写法,在Objective-C中是没有办法做到的。并且Swift的一些语言特性避免了很多Objective-C的坑。使用Swift编写的任何功能,使用Objective-C也可以做到,但是会麻烦

  6. 2017 年热门编程语言排行榜,你的语言上榜没?

    2016年11月的排名结果显示,Java依然是最受大家欢迎的语言,C和C++排名紧随其后。GitHub在2016年9月年度会议之前,Github在此分享了其统计报告。随后它在平台上公布了热门语言排行表。该公司支持30多种编程语言,用户可随心选择。按照使用量排名,Java排在第一位,Javascript,PHP和C以一万多的差距尾随其后。

  7. Swift闭包是否保留捕获的变量?

    我发现Swift闭包并不像我期望的那样保留捕获的变量.我对此非常困惑,因为我一直认为默认情况下会保留捕获的变量.但是,如果我使用捕获列表显式捕获它,它将保留.我重新阅读了Swift手册,但我找不到相关说明.捕获列表用于明确设置无主,我仍然感到困惑.什么是正确的行为,为什么会发生这种情况?

  8. 在Android上解码Java或C/C++中的Airplay数据包

    提前致谢马特解决方法虽然Java编译为在虚拟机中运行的字节码,但它可能不一定比本机编译的可执行文件更慢(或更快).这一切都取决于程序!在这种情况下,Java可能会变慢,原因有很多:>解码实现可能只是编码/优化不佳?(我必须在这里注意,我不是Java的专家!)但是,我仍然不会调用Java本质上比C或C慢.我相信你可以在互联网上找到many-abenchmarks和测试,比较一种语言和另一种语言,有些人声称在一定程度上(出于骄傲和自我?

  9. Java C++ leetcode执行一次字符串交换能否使两个字符串相等

    这篇文章主要为大家介绍了Java C++ leetcode1790执行一次字符串交换能否使两个字符串相等,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. node.js调用C++开发的模块实例

    这篇文章主要介绍了node.js调用C++开发的模块实例,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node,需要的朋友可以参考下

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部