C语言正则表达式详解 regcomp() regexec() regfree()详解
转载自:http://c.biancheng.net/cpp/html/1428.html 标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。 1 接口介绍C语言处理正则表达式常用的函数有 C语言中使用正则表达式一般分为三步: 1.1 regcompint regcomp (regex_t *compiled,const char *pattern,int cflags)
这个函数把指定的正则表达式 参数说明: 1.2 regexecint regexec (regex_t *compiled,char *string,size_t nmatch,regmatch_t matchptr [],int eflags)
当我们编译好正则表达式后,就可以用 typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
成员 参数说明: 1.3 refreevoid regfree (regex_t *compiled)
当我们使用完编译好的正则表达式后,或者要重新编译其他正则表达式的时候,我们可以用这个函数清空 1.4 regerrorsize_t regerror (int errcode,regex_t *compiled,char *buffer,size_t length)
当执行 参数说明: size_t length = regerror (errcode,compiled,NULL,0);
Example例1:下边是一个匹配Email例子,按照上面的三步就可以。 #include <stdio.h>
#include <sys/types.h>
#include <regex.h>
int main(int argc,char **argv)
{
int status;
int i;
int cflags = REG_EXTENDED;
regmatch_t pmatch[1];
const size_t nmatch = 1;
regex_t reg;
const char *pattern = "^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$";
char *buf = "david19842003@gmial.com";
regcomp(®,pattern,cflags);
status = regexec(®,buf,nmatch,pmatch,0);
if (status == REG_NOMATCH){
printf("No Match!n");
} else if(status == 0){
printf("Match: n");
for(i = pmatch[0].rm_so; i < pmatch[0].rm_eo; ++i){
putchar(buf[i]);
}
printf("n");
}
regfree(®);
return 0;
}
例2:下面的程序负责从命令行获取正则表达式,然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。 #include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <regex.h>
/* 取子串的函数 */
static char* substr(const char*str,unsigned start,unsigned end)
{
unsigned n = end - start;
static char stbuf[256];
strncpy(stbuf,str + start,n);
stbuf[n] = 0;
return stbuf;
}
/* 主程序 */
int main(int argc,char** argv)
{
char *pattern;
int x,z,lno = 0,cflags = 0;
char ebuf[128],lbuf[256];
regex_t reg;
regmatch_t pm[10];
const size_t nmatch = 10;
/* 编译正则表达式*/
pattern = argv[1];
z = regcomp(®,cflags);
if (z != 0){
regerror(z,®,ebuf,sizeof(ebuf));
fprintf(stderr,"%s: pattern '%s' n",pattern);
return 1;
}
/* 逐行处理输入的数据 */
while(fgets(lbuf,sizeof(lbuf),stdin))
{
++lno;
if ((z = strlen(lbuf)) > 0 && lbuf[z-1] == 'n')
lbuf[z - 1] = 0;
/* 对每一行应用正则表达式进行匹配 */
z = regexec(®,lbuf,pm,0);
if (z == REG_NOMATCH) continue;
else if (z != 0) {
regerror(z,sizeof(ebuf));
fprintf(stderr,"%s: regcom('%s')n",lbuf);
return 2;
}
/* 输出处理结果 */
for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x)
{
if (!x) printf("%04d: %sn",lno,lbuf);
printf(" $%d='%s'n",x,substr(lbuf,pm[x].rm_so,pm[x].rm_eo));
}
}
/* 释放正则表达式 */
regfree(®);
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |