- #include <sys/types.h>
- #include <regex.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- char *test;
- /*
- int regcomp(regex_t *preg, const char *regex, int cflags);
- int regexec(const regex_t *preg, const char *string, size_t nmatch,
- regmatch_t pmatch[], int eflags);
- size_t regerror(int errcode, const regex_t *preg, char *errbuf,
- size_t errbuf_size);
- void regfree(regex_t *preg);
- */
- int main()
- {
- //编译的正则表达式
- regex_t preg;
- //正则表达式字符串
- // char *pattern = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})";
- // char *pattern = "((?:(?:25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(?:25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))))";
- // char * pattern = "<a>(.+?)</a>";
- // char *pattern = "(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])(\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])){3}";
- // char *pattern = "((2[0-4]\\d|25[0-5]|1?\\d?\\d)\\.){3}(2[0-4]\\d|25[0-5]|1?\\d?\\d)";
- // char *pattern = "2[0-4]\\d|25[0-5]|1\\d?\\d?|[2-99]\\.(2[0-4]\\d|25[0-5]|0|1\\d?\\d?|[2-99]\\.){2}2[0-4]\\d|25[0-5]|0|1\\d?\\d?|[2-99]";
- // char *pattern = "((25[0-5]|2[0-4]\\d|((1\\d{2})|[1-9]?\\d))\\.){3}|(25[0-5]|2[0-4]\\d|((1\\d{2})|[1-9]?\\d))";
- // char *pattern = "((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}).){3})(25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}))";
- // char *pattern = "((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2})\\.)((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2})\\.)((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2})\\.)(25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}))";
- char *pattern = "([0-9]{1,3}[.]){3}[0-9]{1,3}";
- // char *pattern = "((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}).)((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}).)((25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}).)(25[0-5]|(2[0-4][0-9])|([0-1][0-9]{1,2}))";
- //标志使用正则表达式标准扩展并且不区分大小写REG_EXTENDED|REG_ICASE
- int cflags = REG_EXTENDED |REG_NEWLINE , regcomp_return = 0;
- //错误字符串缓冲
- char errbuf[128];
- //第一步:编译生成正则表达式
- regcomp_return = regcomp(&preg, pattern, cflags);
- //如果成功返回0
- if (regcomp_return != 0) {
- regerror(regcomp_return, &preg, errbuf, sizeof(errbuf));
- fprintf(stderr, "%s:pattern '%s'", errbuf, pattern);
- printf("\\n");
- exit(1);
- }
- //第二步:使用生成的正则表达式匹配
- //char *str = "<a>192.168.1.2</a>";
- // char *str = "192.168.1.22";
- char *str;
- // scanf("%s\\n",str);
- printf("write ip:");
- gets(str);
- /*
- typedef struct {
- regoff_t rm_so;
- regoff_t rm_eo;
- } regmatch_t;
- rm_so 该字符串开始匹配的位置
- rm_eo 该字符串在结尾匹配的位置
- */
- regmatch_t pm[1];
- //最大匹配数填充到pm数组中
- const size_t nmatch = 1;
- int z;
- z = regexec(&preg, str, nmatch, pm, 0);
- //如果z不等于0,那么
- if (z != 0) {
- regerror(z, &preg, errbuf, sizeof(errbuf));
- fprintf(stderr, "%s:pattern '%s'", errbuf, pattern);
- printf("\\n");
- exit(1);
- }
- // z = regexec(&preg, str, nmatch, pm, 0);
- int i = 0;
- //这里只会匹配第一个192.168.1.1要进行多次匹配需要将第一次匹配的结果摘除,进行循环匹配
- //提示:使用strcpy函数来摘除已经匹配的字符串
- // char *test;
- test = (char *)malloc(pm[0].rm_eo - pm[0].rm_so);
- for (i = pm[0].rm_so; i < pm[0].rm_eo; i++){
- putchar(str[i]);
- // int len = pm[0].rm_eo - pm[0].rm_so;
- // memset(cmatch,'\\0',sizeof(cmatch));
- // memcpy(cmatch,str+pm[i].rm_so,len);
- // printf("%s\\n",cmatch);
- }
- printf("\\n");
- memset(test, '\\0', sizeof(test));
- // memcpy(test, str+pm[0].rm_so,pm[0].rm_eo-pm[0].rm_so);
- memcpy(test,str, pm[0].rm_eo - pm[0].rm_so);
- printf("memcpy:%s\\n",test);
- free(test);
- //释放正则表达式
- regfree(&preg);
- printf("get %s\\n",str);
- return 1;
- }
- //该片段来自于http://www.codesnippet.cn/detail/051220137774.html
来源: http://www.codesnippet.cn/detail/051220137774.html