应用正则表达式判断IP/MAC/DNS合法性

C中使用正则表达式

在C语言中使用正则表达式也是件很简单的事,但真正会用的人好像很少啊真是遗憾。其实应用正则表达式判断一些格式的合法性非常方便。下面就举几个例子先睹为快。

本文例子都经过测试可放心使用。


正则表达式封装

我们不必关心正则引擎的打开关闭等,因此把相关操作封装到一个函数中,实现如下:

注:使用正则表达式时需要包含头文件(#include 

/**
 * 判断字符串是否满足正则表达式
 * 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;
}


MAC地址校验
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;
}

最后
这样我们就可以随意的使用正则表达式了,真是太棒了。

你可能感兴趣的:(C)