Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4958680
  • 博文数量: 921
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11216
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(921)

文章存档

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: LINUX

2013-09-13 09:01:37

写个程序,需要处理ip字符串,在做合法性校验的时候感觉太麻烦,于是想到了正则。看了一下手册,试用一下。

1 源码   检测ipv4字符串的合法性

  1. #include <sys/types.h>
  2. #include <regex.h>

  3. #include <stdio.h>
  4. #include <stdlib.h>

  5. #define IP_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])$"


  6. static void regex_emsg(int errorcode, regex_t *preg);

  7. int main(int argc, char *argv[])
  8. {
  9.     regex_t reg;
  10.     regmatch_t match[5];
  11.     int retval;

  12.     if (argc != 2) {
  13.         fprintf(stderr, "usage: %s \n"
  14.                 "example: %s 1.2.3.4\n",
  15.                 argv[0], argv[0]);
  16.         exit(EXIT_FAILURE);
  17.     }

  18.     retval = regcomp(&reg, IP_PATTERN, REG_EXTENDED | REG_NEWLINE);
  19.     if (retval != 0)
  20.         regex_emsg(retval, &reg);

  21.     retval = regexec(&reg, argv[1], sizeof match / sizeof match[0], match, 0);
  22.     printf("%s is %s\n", argv[1], retval == 0 ? "legal" : "illegal");
  23.     regfree(&reg);

  24.     /*
  25.      * 如果是正确的ip, 输出详细的匹配过程
  26.      */
  27.     if (retval == 0) {
  28.         int i;
  29.         for (i = 1; i < sizeof match / sizeof match[0]; i++) {
  30.             printf("ip part[%d]: %.*s\n", i, match[i].rm_eo - match[i].rm_so,
  31.                     argv[1] + match[i].rm_so);
  32.         }
  33.     }

  34.     exit(EXIT_SUCCESS);

  35. }


  36. /*
  37.  * 输出regexXXX调用出错消息
  38.  */
  39. static void regex_emsg(int errorcode, regex_t *preg)
  40. {
  41.     char msg[512] = {'\0'};

  42.     regerror(errorcode, preg, msg, sizeof msg - 1);
  43.     fputs(msg, stderr);
  44.     fputc('\n', stderr);
  45.     return;
  46. }

  47.     /* filename: regex_checkip.c */
  1. 将上面代码编译gcc -Wall regex_checkip.c -o checkip
  2. 运行下面的测试基本test.sh ./checkip
2 测试脚本
  1. #!/bin/sh
  2. # filename: test.sh



  3. $1 0.0.0.0
  4. echo ""

  5. $1 1.1.1.1
  6. echo ""
  7. $1 255.255.255.255
  8. echo ""
  9. $1 a1.1.1.1
  10. echo ""
  11. $1 1.1.1.1b
  12. echo ""
  13. $1 256.255.255.255
  14. echo ""
  15. $1 1.23.234.0
  16. echo ""
  17. $1 a.b.sd.d
  18. echo ""
  19. $1 192.168.54.48
  20. echo ""
3 测试结果
  1. 0.0.0.0 is legal
  2. ip part[1]: 0
  3. ip part[2]: 0
  4. ip part[3]: 0
  5. ip part[4]: 0

  6. 1.1.1.1 is legal
  7. ip part[1]: 1
  8. ip part[2]: 1
  9. ip part[3]: 1
  10. ip part[4]: 1

  11. 255.255.255.255 is legal
  12. ip part[1]: 255
  13. ip part[2]: 255
  14. ip part[3]: 255
  15. ip part[4]: 255

  16. a1.1.1.1 is illegal

  17. 1.1.1.1b is illegal

  18. 256.255.255.255 is illegal

  19. 1.23.234.0 is legal
  20. ip part[1]: 1
  21. ip part[2]: 23
  22. ip part[3]: 234
  23. ip part[4]: 0

  24. a.b.sd.d is illegal

  25. 192.168.54.48 is legal
  26. ip part[1]: 192
  27. ip part[2]: 168
  28. ip part[3]: 54
  29. ip part[4]: 48

感觉用着还可以。:-)
阅读(6099) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~