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