C++/C中使用轻量级的正则表达式

来源:互联网 发布:java 查看函数签名 编辑:程序博客网 时间:2024/06/05 03:18


  由于编译原理上机实验中有一道题是关于词法分析的程序设计,里面需要用到正则表达式来匹配标示符以及关键保留字,但是标准C++库中没有正则表达式引擎,网上虽然有其他方法比如大名鼎鼎的boost库,但是在c++中使用boost的正则表达式引擎则略显麻烦,毕竟为了一个很简单的小程序用上重量级的boost库有点大材小用了。庆幸的是在网上发现了一个很轻量级,用起来超方便的正则表达式引擎DEELX 正则引擎”官方网站

http://www.regexlab.com/zh/regref.htm

在里面可以下载库(其实也就一个头文件,没想到会这么轻量级吧,嘿嘿),更为令人兴奋地是里面有中文帮助文档,并且文档上对常用正则表达式应用也讲的很是详细,

兴奋ing 

下面上个demo,匹配代码中的注释(仅匹配/* */注释,如果还想匹配//注释可以自己扩展)


#include "deelx.h"#include<stdio.h>
int find_remark(const char * string, int & start, int & end){    // declare    static CRegexpT <char> regexp("/\\*((?!\\*/).)*(\\*/)?|//([^\\x0A-\\x0D\\\\]|\\\\.)*");    // find and match    MatchResult result = regexp.Match(string);    // result    if( result.IsMatched() )    {        start = result.GetStart();        end   = result.GetEnd  ();        return 1;    }    else    {        return 0;    }}int main(int argc, char * argv[]){    char * code1 = "int a; /* a */";    char * code2 = "int a;";    int start, end;    if( find_remark(code1, start, end) )        printf("In code1, found: %.*s\n", end - start, code1 + start);    else        printf("In code1, not found.\n");    if( find_remark(code2, start, end) )        printf("In code2, found: %.*s\n", end - start, code2 + start);    else        printf("In code2, not found.\n");    return 0;} 

 

说明:
本例中的表达式,考虑了 C 注释(/*...*/)以及 C++ 注释(//...)。
但未排出注释标记位于字符串内部的情况。