C语言正则表达式的匹配问题
题目: C语言正则表达式详解 regcomp() regexec() regfree()详解。 背景: 标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。 实现步骤: C语言中使用正则表达式一般分为三步: 函数形式:int regcomp (regex_t *compiled,const char *pattern,int cflags) 参数说明: 2)匹配正则表达式 regexec() 函数形式:int regexec (regex_t *compiled,char *string,size_t nmatch,regmatch_t matchptr [],int eflags) 参数说明: 3)释放正则表达式 regfree() 函数形式: void regfree (regex_t *compiled) 4)补充 size_t regerror (int errcode,regex_t *compiled,char *buffer,size_t length) 运行代码: #include <stdio.h> #include <sys/types.h> #include <regex.h> #include <string.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 *temp="regex.heoll"; 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];//"^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$";// z = regcomp(®,pattern,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,nmatch,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; }代码截图:
运行结果如下: 从中我们可以看出,是为了实现regx[a-z]的一个匹配,运行结果显示,在第3行,有一个regex;在19行有一个char *temp="regex.hello";在第23行有一个regex_t reg;上述的匹配结果都是regex。 在第41行有一个z = regexec(®,0);,其匹配结果为regexec。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |