使用正则表达式检查IP地址是否合法

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
/* 编译命令: gcc -o test test.c
 执行命令: ./test "192.168.1.1"
 编写正则表达式 */

#define IP_V4_PATTERN \
"^([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])\
.([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])\
.([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])\
.([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"

#define IP_V6_PATTERN \
"^\\s*((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}\
(:|((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})|\
(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\
(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|\
(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\
(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|\
(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\
(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|\
(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\
(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|\
(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\
(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|\
(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\
(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|\
(((25[0-5]|2[0-4]\\d|[01]?\\d{1,2})(\\.(25[0-5]|2[0-4]\\d|[01]?\\d{1,2})){3})))(%.+)?\\s*$"

/*
 return 1 :ipv4 success
 return 2 :ipv6 success
 return < 0 : error addr
 */
int check_ipaddr(char* ipaddr) {
    if (NULL == ipaddr || strlen(ipaddr) > 40) {
        printf("ip:%s NG\n", ipaddr);
        return -1;
    }

    char* pstr = NULL;
    pstr = strstr(ipaddr, ":");

    regex_t reg;
    int returnval = 0;
    int ret;
    if (NULL == pstr) { //ipv4
        /*检查正则表达式语法,并编译成 regex_t结构*/
        ret = regcomp(&reg, IP_V4_PATTERN, REG_EXTENDED | REG_NEWLINE);
        if (ret != 0) {
            return -1;
        }
        returnval = 1;
    } else {  //ipv6
        ret = regcomp(&reg, IP_V6_PATTERN, REG_EXTENDED | REG_NEWLINE);
        if (ret != 0) {
            return -1;
        }
        returnval = 2;
    }

    /*存储正则表达式的匹配结果*/
    /*因为正则表达式可以嵌套,因此可能出现多个正则表达式执行结果,一般都是使用一个正则表达式*/
    /*若使用嵌套正则表达式,则需要逐个对每个正则表达式的执行结果进行判断*/
    regmatch_t match[9];
    /*使用regex_t 与输入的IP地址匹配*/
    ret = regexec(&reg, ipaddr, sizeof match / sizeof match[0], match, 0);
    regfree(&reg); /*若连续使用,必须释放后再使用*/
    if (ret != 0) {
        return -1;
    }
    return returnval;
}

int main(int argc, char* argv[]) {
    fprintf(stdout, " input ipaddress is %s.\n", argv[1]);
    int ret = check_ipaddr(argv[1]);
    if (ret < 0) {
        fprintf(stdout, "ip: %s invalid.\n", argv[1]);
        return -1;
    }
    if (1 == ret) {
        fprintf(stdout, "ipv4: %s OK.\n", argv[1]);
    }
    if (2 == ret) {
        fprintf(stdout, "ipv6: %s OK.\n", argv[1]);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/Chris83/p/9517488.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值