C语言正则表达式研究

Posted on 2012-05-16 22:51  逝水如年  阅读(229)  评论(0)    收藏  举报
 1 #include <sys/types.h>
 2 #include <regex.h>
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 /*
 6 int regcomp(regex_t *preg, const char *regex, int cflags);
 7 
 8 int regexec(const regex_t *preg, const char *string, size_t nmatch,
 9            regmatch_t pmatch[], int eflags);
10 
11 size_t regerror(int errcode, const regex_t *preg, char *errbuf,
12                size_t errbuf_size);
13 
14 void regfree(regex_t *preg);
15 */
16 int main()
17 {
18     //编译的正则表达式
19     regex_t preg;
20     //正则表达式字符串
21     char *pattern = "([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})";
22   // char * pattern = "<a>(.+?)</a>";
23     //标志使用正则表达式标准扩展并且不区分大小写REG_EXTENDED|REG_ICASE
24     int cflags = REG_EXTENDED|REG_NEWLINE, regcomp_return = 0;
25     //错误字符串缓冲
26     char errbuf[128];
27     //第一步:编译生成正则表达式
28     regcomp_return = regcomp(&preg, pattern, cflags);
29     //如果成功返回0
30     if (regcomp_return != 0) {
31         regerror(regcomp_return, &preg, errbuf, sizeof(errbuf));
32         fprintf(stderr, "%s:pattern '%s'", errbuf, pattern);
33         exit(1);
34     }
35 
36     //第二步:使用生成的正则表达式匹配
37     char *str = "<a>192.168.1.1</a><a>192.168.1.2</a>";
38     /*
39     typedef struct {
40        regoff_t rm_so;
41        regoff_t rm_eo;
42     } regmatch_t;
43     rm_so 该字符串开始匹配的位置
44     rm_eo 该字符串在结尾匹配的位置
45     */
46     regmatch_t pm[1];
47     //最大匹配数填充到pm数组中
48     const size_t nmatch = 1; 
49     int z;
50     z = regexec(&preg, str, nmatch, pm, 0);
51     //如果z不等于0,那么
52     if (z != 0) {
53         regerror(z, &preg, errbuf, sizeof(errbuf));
54         fprintf(stderr, "%s:pattern '%s'", errbuf, pattern);
55         exit(1);
56     }
57     z = regexec(&preg, str, nmatch, pm, 0);
58     int i = 0;
59     //这里只会匹配第一个192.168.1.1要进行多次匹配需要将第一次匹配的结果摘除,进行循环匹配
60     //提示:使用strcpy函数来摘除已经匹配的字符串
61     for (i = pm[0].rm_so; i < pm[0].rm_eo; ++i){
62         putchar(str[i]);
63     }
64     //释放正则表达式
65     regfree(&preg);
66     
67     return 1;
68 }

重要提示:要进行多次匹配需要将第一次匹配的结果摘除,进行循环匹配  利用strcpy函数来摘除已经匹配的字符串

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3