BCB6自带的正则表达式功能
By hakka. Filed in 技术随笔 |对于C++下的正则表达式,我想用得比较多的应该就是Boost里的regex了。自从BCB2009自带了Boost1.35以后,这个regex也自然进入了BCB自带的功能行列。
对于还没用上BCB2009的人来说也不用为了一个正则表达式功能急着找boost的安装方法,其实BCB6早已经帮我们准备好了:TRegexp和pcre库。不过当年Borland也太“谦虚”了点,竟然没把这么重要的功能写进帮助?!!
先看看轻量级的TRegexp
说它是轻量级是因为它没有完整支持正则表达式,功能也很单一,只有一个find。看下面代码演示:
#include <stdio.h> #include <stdlib.h> #include <regexp.h> int main(int argc, char* argv[]) { char szReg[]="[0-9]+"; // 正则表达式,表示一个或多个'0'到'9'的字符串 char szStr[]="a123b03ad94fg45"; // 待匹配的字符串 printf("Regex: %s\n",szReg); printf("Str: %s\n",szStr); printf("Result: \n"); TRegexp regex(szReg); for(size_t len=0, nPos = regex.find(szStr,&len); // 用find查找匹配的字符串。nPos返回子串位置[size_t(-1)表示没找到匹配的字符串],len返回子串长度 nPos!=size_t(-1); nPos = regex.find(szStr,&len,nPos+len)) // 从nPos+len位置开始继续查找... { printf("%.*s\n", len, szStr+nPos); // 打印出查找结果 } system("pause"); return 0; } |
虽然就一个find,功能是寒碜了一点,好在使用还算方便。在它的基础上做Match和Replace的功能也应该不算太难的事。
对正则表达式比较熟悉的朋友一定在想为什么不把char szReg[]=”[0-9]+”;改成char szReg[]=”\\d+”;呢?这就是偶说它功能还不完整的原因,它不支持’\'操作符!(也许有其它替代,反正偶没找到,要是哪位路过的知道 TRegexp使用’\'的方法,一定要留个言哦)。
于是,下面我们请出完美的pcre库。pcre库的全称是:Perl- compatible regular expressions。从名称上可以看出它遵循的是Perl的正则表达式语法,功能那是绝对没得说。不过遗憾的是BCB没有进一步把pcrecpp也带进来,所以只能用纯C的方式调用了:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pcre.h> int main(int argc, char* argv[]) { char szReg[]="d(\\d+)f"; // 抽出a和f之间的数字 char szStr[]="a123b03ad94fg45"; printf("Regex: %s\n",szReg); printf("Str: %s\n",szStr); printf("Result: \n"); const char *pszErr; int nErrOffset; pcre *re = pcre_compile(szReg,0,&pszErr,&nErrOffset,NULL); // 先准备表达式 if(re==NULL) { printf("compile error at:%d, %s", nErrOffset, pszErr); return -1; } int ovector[30]; // 数量由szReg决定,大致为(括号对数+1)*3,可以用pcre_info获得或者直接留大一点。 int len = strlen(szStr); int rc = pcre_exec(re, NULL, szStr, len, 0, ovector, 30); // 执行匹配 for(int i=0; i<rc; i++) { char *substring_start = szStr + ovector[2*i]; int substring_length = ovector[2*i+1] - ovector[2*i]; printf("%2d: %.*s\n", i, substring_length, substring_start); } free(re); // 别忘了这个 system("pause"); return 0; } |
对于pcre库的使用,可以到它的官方网站www.pcre.org去学习。 如果觉得不过瘾,也可以自己装过一个最新版的,再弄个pcrecpp什么的,呵呵。
