2014年(83)
分类: C/C++
2014-07-17 15:50:57
原文地址:pcre regex 使用example 作者:bjpiao
在使用PCRE库时,首先肯定是需要安装pcre的,不过一般的系统都会有自带的PCRE库。不过如果想使用最新版本的话,也可以自已下载一个安装包。我这里下载的安装是pcre-8.13.tar.gz版本。安装过程很简单,把安装包上传需要安装的服务器上,安装时默认路径即可,我是在linux环境下安装的,执行命令如下:
1.[root@host70-151 pcre-8.13]# ./configure
2.[root@host70-151 pcre-8.13]# make && make install
此两步即可安装完成,安装成功后的头文件在:/usr/local/include, 库文件在:/usr/local/lib 。
下面是我的一个使用PCRE库函数的一个小例子,其功能是匹配手机号码的正则表达式是否成功,分成四类手机号码时行匹配,分别是移动、电信、联通和CDMA的手机号。里面用到了PCRE库函数中的pcre_compile()和pcre_exec():
因为我是在linux下编译C程序的,所以要用到makefile文件。注意:如果你在编译时出现提示:
/usr/zej/zej_test/kernel/pcre_test2.c:29: undefined reference to `pcre_compile'
/usr/zej/zej_test/kernel/pcre_test2.c:35: undefined reference to `pcre_exec'
没有定义pcre.h文件里面的函数时,是因为没有链接到库文件里,这时可以能过修改makefile,在l里面添加一个lpcre即可。然后在编译便可成功。
#include
#include
#include
#include
#define OVECCOUNT 30 /* should be a multiple of 3 */
#define EBUFLEN 128
#define BUFLEN 1024
int main()
{
pcre *reCM, *reUN, *reTC, *reCDMA;
const char *error;
int erroffset;
int ovector[OVECCOUNT];
int rcCM, rcUN, rcTC, rcCDMA, i;
/*
常用号段前三位
中国移动:134.135.136.137.138.139.150.151.152.157.158.159.187.188 ,147(数据卡)
中国联通:130.131.132.155.156.185.186
中国电信:133.153.180.189
CDMA :133,153
*/
char src[22];
char pattern_CM[] = "^1(3[4-9]|5[012789]|8[78])\\d{8}$";
char pattern_UN[] = "^1(3[0-2]|5[56]|8[56])\\d{8}$";
char pattern_TC[] = "^18[09]\\d{8}$";
char pattern_CDMA[] = "^1[35]3\\d{8}$";
printf("please input your telephone number \n");
scanf("%s", src);
printf("String : %s\n", src);
printf("Pattern_CM: \"%s\"\n", pattern_CM);
printf("Pattern_UN: \"%s\"\n", pattern_UN);
printf("Pattern_TC: \"%s\"\n", pattern_TC);
printf("Pattern_CDMA: \"%s\"\n", pattern_CDMA);
reCM = pcre_compile(pattern_CM, 0, &error, &erroffset, NULL); //将正则表达式编译成pcre内部表示结构
reUN = pcre_compile(pattern_UN, 0, &error, &erroffset, NULL);
reTC = pcre_compile(pattern_TC, 0, &error, &erroffset, NULL);
reCDMA = pcre_compile(pattern_CDMA, 0, &error, &erroffset, NULL);
if (reCM==NULL && reUN==NULL && reTC==NULL && reCDMA==NULL) {
printf("PCRE compilation telephone failed at offset %d: %s\n", erroffset, error);
return 1;
}
rcCM = pcre_exec(reCM, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT); //匹配pcre编译好的模式,成功返回正数,失败返回负数
rcUN = pcre_exec(reUN, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT);
rcTC = pcre_exec(reTC, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT);
rcCDMA = pcre_exec(reCDMA, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT);
if (rcCM<0 && rcUN<0 && rcTC<0 && rcCDMA<0) { //若没匹配返回错误信息
if (rcCM==PCRE_ERROR_NOMATCH && rcUN==PCRE_ERROR_NOMATCH &&
rcTC==PCRE_ERROR_NOMATCH && rcTC==PCRE_ERROR_NOMATCH) {
printf("Sorry, no match ...\n");
}
else {
printf("Matching error %d\n", rcCM);
printf("Matching error %d\n", rcUN);
printf("Matching error %d\n", rcTC);
printf("Matching error %d\n", rcCDMA);
}
free(reCM);
free(reUN);
free(reTC);
free(reCDMA);
return 1;
}
printf("\nOK, has matched ...\n\n");
if (rcCM > 0) {
printf("Pattern_CM: \"%s\"\n", pattern_CM);
printf("String : %s\n", src);
}
if (rcUN > 0) {
printf("Pattern_UN: \"%s\"\n", pattern_UN);
printf("String : %s\n", src);
}
if (rcTC > 0) {
printf("Pattern_TC: \"%s\"\n", pattern_TC);
printf("String : %s\n", src);
}
if (rcCDMA > 0) {
printf("Pattern_CDMA: \"%s\"\n", pattern_CDMA);
printf("String : %s\n", src);
}
free(reCM); //释放内存
free(reUN);
free(reTC);
free(reCDMA);
return 0;
}
[1]:一些正则表达库的对比
[2]:Boost和PCRE正则库的性能对比
[3]:正则表达式语言元素