C中使用正则表达式
在C语言中使用正则表达式也是件很简单的事,但真正会用的人好像很少啊真是遗憾。其实应用正则表达式判断一些格式的合法性非常方便。下面就举几个例子先睹为快。
本文例子都经过测试可放心使用。
正则表达式封装
我们不必关心正则引擎的打开关闭等,因此把相关操作封装到一个函数中,实现如下:
注:使用正则表达式时需要包含头文件(#include<regex.h>)
/** * 判断字符串是否满足正则表达式 * regex_pattern: 正则表达式 * to_match: 待匹配正则表达式的字符串 * 返回值: -1 不匹配 * 0 匹配 */ int regex_exe(const char *regex_pattern,const char *to_match) { regex_t r; int ret; int match; char errmsg[128]; if(regcomp(&r,regex_pattern,REG_EXTENDED | REG_NEWLINE)) { printf("regcomp Failed!\n"); regfree(&r); return -1; } ret = regexec(&r,to_match,NULL,0); if(!ret) { match = 1; printf("match!\n"); } else if(ret == REG_NOMATCH) { match = 0; printf("not match!\n"); } else { regerror(ret,&r,errmsg,sizeof(errmsg)); printf("regexec Failed: %s!\n",errmsg); regfree(&r); return -1; } regfree(&r); return match; }有了这个函数,我们就可以根据学过的正则表达式知识,完成IP/MAC/DNS等的校验了。
IP地址校验
int check_ip(const char *ip) { int match; const char validIpAddress[] = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"; match = regex_exe(validIpAddress,ip); if(match != 1) { return -1; } return 0; }
int check_mac(const char *mac) { int match; const char validMacAddress[] = "^([a-fA-F0-9]{2}:){5}([a-fA-F0-9]{2})$"; printf("%s\n",mac); match = regex_exe(validMacAddress,mac); if(match != 1) { return -1; } return 0; }
DNS域名校验
int check_dns(const char *dns) { int match; const char validDnsRegex[] = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$"; printf("%s\n",dns); match = regex_exe(validDnsRegex,dns); if(match != 1) { return -1; } return 0; }
最后
这样我们就可以随意的使用正则表达式了,真是太棒了。