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函数来摘除已经匹配的字符串
浙公网安备 33010602011771号