BCB6自带的正则表达式功能

对于C++下的正则表达式,我想用得比较多的应该就是Boost里的regex了。自从BCB2009自带了Boost1.35以后,这个regex也自然进入了BCB自带的功能行列。

对于还没用上BCB2009的人来说也不用为了一个正则表达式功能急着找boost的安装方法,其实BCB6早已经帮我们准备好了:TRegexp和pcre库。不过当年Borland也太“谦虚”了点,竟然没把这么重要的功能写进帮助?!!

先看看轻量级的TRegexp
说它是轻量级是因为它没有完整支持正则表达式,功能也很单一,只有一个find。看下面代码演示:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <regexp.h>
  4. int main(int argc, char* argv[])
  5. {
  6.     char szReg[]="[0-9]+";             // 正则表达式,表示一个或多个'0'到'9'的字符串
  7.     char szStr[]="a123b03ad94fg45";    // 待匹配的字符串
  8.     printf("Regex: %s/n",szReg);
  9.     printf("Str: %s/n",szStr);
  10.     printf("Result: /n");
  11.     TRegexp regex(szReg);
  12.     for(size_t len=0, nPos = regex.find(szStr,&len);   // 用find查找匹配的字符串。nPos返回子串位置[size_t(-1)表示没找到匹配的字符串],len返回子串长度
  13.         nPos!=size_t(-1);
  14.         nPos = regex.find(szStr,&len,nPos+len))      // 从nPos+len位置开始继续查找...
  15.     {
  16.         printf("%.*s/n", len, szStr+nPos);          // 打印出查找结果
  17.     }
  18.     system("pause");
  19.     return 0;
  20. }

虽然就一个find,功能是寒碜了一点,好在使用还算方便。在它的基础上做Match和Replace的功能也应该不算太难的事。

对正则表达式比较熟悉的朋友一定在想为什么不把char szReg[]="[0-9]+";改成char szReg[]="//d+";呢?这就是偶说它功能还不完整的原因,它不支持'/'操作符!(也许有其它替代,反正偶没找到,要是哪位路过的知道TRegexp使用'/'的方法,一定要留个言哦)。

于是,下面我们请出完美的pcre库。pcre库的全称是:Perl-compatible regular expressions。从名称上可以看出它遵循的是Perl的正则表达式语法,功能那是绝对没得说。不过遗憾的是BCB没有进一步把pcrecpp也带进来,所以只能用纯C的方式调用了:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <pcre.h>
  5. int main(int argc, char* argv[])
  6. {
  7.     char szReg[]="d(//d+)f";        // 抽出a和f之间的数字
  8.     char szStr[]="a123b03ad94fg45";
  9.     printf("Regex: %s/n",szReg);
  10.     printf("Str: %s/n",szStr);
  11.     printf("Result: /n");
  12.     const char      *pszErr;
  13.     int             nErrOffset;
  14.     pcre *re = pcre_compile(szReg,0,&pszErr,&nErrOffset,NULL);      // 先准备表达式
  15.     if(re==NULL)
  16.     {
  17.         printf("compile error at:%d, %s", nErrOffset, pszErr);
  18.         return -1;
  19.     }
  20.     int ovector[30];    // 数量由szReg决定,大致为(括号对数+1)*3,可以用pcre_info获得或者直接留大一点。
  21.     int len = strlen(szStr);
  22.     int rc = pcre_exec(re, NULL, szStr, len, 0, ovector, 30);   // 执行匹配
  23.     for(int i=0; i<rc; i++)
  24.     {
  25.         char *substring_start = szStr + ovector[2*i];
  26.         int substring_length = ovector[2*i+1] - ovector[2*i];
  27.         printf("%2d: %.*s/n", i, substring_length, substring_start);
  28.     }
  29.     free(re);   // 别忘了这个
  30.     system("pause");
  31.     return 0;
  32. }
对于pcre库的使用,可以到它的官方网站www.pcre.org去学习。 如果觉得不过瘾,也可以自己装过一个最新版的,再弄个pcrecpp什么的,呵呵。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值