首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-11-03 
正则表达式匹配(c/c++)非注释部分最近在写一个C的parser,里面有一个功能是要解析出所有有效的头文件。如有

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

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


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

在这里我假设读者已经有基本的正则知识,如果没有的话,建议看一下<<正则表达式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++)非注释部分正则表达式婚配(c/c++)非注释部分






热点排行