正则表达式是能极大地提高工作效率的工具,使用过Linux下各种具备RE特性的工具的人一定对此深有感触。很多语言都支持RE,用的最多的当然是脚本,其中以perl最盛。不过,用C语言来用RE不是很多见,但是有时候也很有用,我最近也是看到别人说道这个,所以搜了一些资料加上自己的体会来说一说RE在C语言里的应用。C语言本身不具备RE特性,但是有很多库,在Linux下你可以很方便的使用regex.h提供的库。 下面是个小应用,处理mac地址的正则
#include <stdio.h> #include <sys/types.h> #include <regex.h> #include <memory.h> #include <stdlib.h>
//判断是否符合所要求格式,正确返回0,错误返回非0
int deal_str(char buf[]) { //char *pattern = "([0-9A-Fa-f]{2}):([0-9A-Fa-f]{2}):([0-9A-Fa-f]{2}):([0-9A-Fa-f]{2}):([0-9A-Fa-f]{2}):([0-9A-Fa-f]{2})"; char *pattern = "([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}"; char errbuf[1024]; //char match[100]; regex_t reg; int err=0,nm = 10; regmatch_t pmatch[nm]; //把指定的规则表达式pattern编译成一种特定的数据格式compiled,这样可以使匹配更有效 if(regcomp(®,pattern,REG_EXTENDED) < 0) { regerror(err,®,errbuf,sizeof(errbuf)); printf("err:%sn",errbuf); } //会使用这个数据在目标文 本串中进行模式匹配。执行成功返回0 err = regexec(®,(char *)buf,nm,pmatch,0); if(err == REG_NOMATCH) { printf("no matchn"); return -1; } else if(err) { regerror(err,errbuf); return -1; } return 0; }
主函数调用deal_str,判断返回值即可。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|