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, 0, 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;
}
最后
这样我们就可以随意的使用正则表达式了,真是太棒了。