偶然的机会让我满足了linux c 中使用正则表达式的一个机会。程序设计的目的是生成一个so文件,能够对拔入的号码进行正则匹配,允许以133、153、189开头的号码进入呼叫队列。程序调用的是libxml2的库函数,相信用过的人不会陌生。程序大概是如下:
int matchTel(char* str_reg,char* str_tel){
int matchTel(char* str_reg,char* str_tel){
regex_t preg;
int i_errno;
char str_error[128]={0};
regmatch_t pm[1]={0};
const size_t nmatch = 1;
i_errno=regcomp(&preg,str_reg,0);
if(i_errno!=0){//如果正则表达式不合法,返回
return -1;
}
i_errno=regexec(&preg,str_tel,nmatch,pm,0);
if(i_errno!=0){//正则表达式不匹配字符串,返回
return 0;
}else{//如果匹配,返回
return 1;
}
int i_errno;
char str_error[128]={0};
regmatch_t pm[1]={0};
const size_t nmatch = 1;
i_errno=regcomp(&preg,str_reg,0);
if(i_errno!=0){//如果正则表达式不合法,返回
return -1;
}
i_errno=regexec(&preg,str_tel,nmatch,pm,0);
if(i_errno!=0){//正则表达式不匹配字符串,返回
return 0;
}else{//如果匹配,返回
return 1;
}
}
一开始时传入str_reg="^1(33|53|89)",str_tel="13378977777"返回的是0,也就是regcomp编译正则表达式可以通过,但是不能匹配。后几经波折最后传入str_reg="^1//(33//|53//|89//)[0-9]{8}"才达到目的。
我的理解是str_reg="^1(33|53|89)",如果没有转义,通过gcc,regcomp以后,还是普通的字符串"^1(33|53|89)"。如果"^1//(33//|53//|89//)[0-9]{8}"经过gcc转义后,为"^1/(33/|53/|89/)[0-9]{8}",再经过regcomp编译后"^1/(33/|53/|89/)[0-9]{8}",就达到预期的效果。在linux C中的对定义的正则表达式进行编译时必须要使用'(',')'等必须对其转义。