PCRE函数在C语言中的使用小例子

2020-04-17 07:19

PCRE函数在C语言中的使用小例子

在使用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[] = \ char pattern_UN[] = \ char pattern_TC[] = \ char pattern_CDMA[] = \

printf(\ scanf(\

printf(\

printf(\ printf(\ printf(\

printf(\

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(\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(\ } else {

printf(\ printf(\ printf(\ printf(\ } free(reCM); free(reUN); free(reTC);

free(reCDMA); return 1; }

printf(\ if (rcCM > 0) {

printf(\ printf(\ }

if (rcUN > 0) {

printf(\ printf(\ }

if (rcTC > 0) {

printf(\ printf(\ }

if (rcCDMA > 0) {

printf(\ printf(\ }

free(reCM); //释放内存 free(reUN); free(reTC);

free(reCDMA); return 0; }

下面是编译通过后,运行程序后的结果:

按照提示输入手机号:13591995735(移动手机号)

随便输入一个号码:7459812

输入联通手机号码:13006666039

输入电信手机号码:18900000036

[1]:一些正则表达库的对比

http://www.regular-expressions.info/refflavors.html [2]:Boost和PCRE正则库的性能对比

http://www.boost.org/doc/libs/1_40_0/libs/regex/doc/gcc-performance.html [3]:正则表达式语言元素

http://msdn.microsoft.com/zh-cn/library/az24scfc.aspx


PCRE函数在C语言中的使用小例子.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:额如乡下格斯户村移民安置区中低产田改造项目实施方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: