全部博文(127)
分类: LINUX
2012-04-26 14:33:41
C语言中巧用正则表达式 |
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。 int regcomp(regex_t *preg, const char *regex, int cflags); Param 参数regex是一个字符串,它代表将要被编译的正则表达式; 参数preg指向一个声明为regex_t的数据结构,用来保存编译结果; 参数cflags决定了正则表达式该如何被处理的细节。 如果函数regcomp()执行成功,并且编译结果被正确填充到preg中后,函数将返回0, 任何其它的返回结果都代表有某种错误产生。 int regexec( const regex_t *preg, const char *string , size_t nmatch, regmatch_t pmatch[], int eflags ); typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t; Param 参数string是将要进行匹配的字符串, 参数nmatch和pmatch则用于把匹配结果返回给调用程序, 参数eflags决定了匹配的细节。
Param 参数errcode 是来自函数regcomp()或regexec()的错误代码, 参数preg 是由函数regcomp()得到的编译结果, 其目的是把格式化消息所必须的上下文提供给regerror()函数。 参数errbuf_size指明的最大字节数,
#include #include /* 取子串的函数 */ static char* substr (const char*str, unsigned start, unsigned end) { unsigned n = end - start; static char stbuf[256]; strncpy(stbuf, str + start, n); stbuf[n] = 0; return stbuf; } /* 主程序 */ int main(int argc, char** argv) { char * pattern; int x, z, lno = 0, cflags = 0; char ebuf[128], lbuf[256]; regex_t reg; regmatch_t pm[10]; const size_t nmatch = 10; /* 编译正则表达式*/ pattern = argv[1]; z = regcomp(?, pattern, cflags); if (z != 0) { regerror(z, ?, ebuf, sizeof(ebuf)); fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern); return 1; } /* 逐行处理输入的数据 */ while(fgets(lbuf, sizeof(lbuf), stdin)) { ++lno; if ((z = strlen(lbuf)) > 0 && lbuf[z-1] == '\n') lbuf[z - 1] = 0; /* 对每一行应用正则表达式进行匹配 */ z = regexec(?, lbuf, nmatch, pm, 0); if (z == REG_NOMATCH) continue; else if (z != 0) { regerror(z, ?, ebuf, sizeof(ebuf)); fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf); return 2; } /* 输出处理结果 */ for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x) { if (!x) printf("%04d: %s\n", lno, lbuf); printf(" $%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo)); } } /* 释放正则表达式 */ regfree(?); return 0; }
# ./regexp 'regex[a-z]*' < regexp.c 0003: #include 0027: regex_t reg; $0='regex' 0054: z = regexec(?, lbuf, nmatch, pm, 0); $0='regexec'
|