【正则表达式】【? [] () | 组合使用】【Linux C】

来源:互联网 发布:mysql事务回滚 原理 编辑:程序博客网 时间:2024/04/30 17:02

^[a-zA-Z]+_(replace[0-9]?_)?(bak|old|old2|NG)$

匹配

XXX_bak
XXX_old
XXX_old2
XXX_replace_NG
XXX_replace2_NG
XXX_replace_old

http://baike.baidu.com/view/94238.htm


1、POSIX函数库Linux regex.h 

2、PCRE  (http://www.pcre.org
PCRE的名字就说明了是Perl Compatible,熟悉Perl、PHP的人使用起来完全没有问题。PCRE有非常丰富的使用说明和示例代码(看看pcredemo.c就能明白基本的用法),下面的程序只是把上面regex改为pcre。

http://blog.csdn.net/sahusoft/article/details/4196342

3、pcre++
pcre++(http://www.daemon.de/PCRE)对pcre做了c++封装,使用起来更加方便。

4、oniguruma
还有一个正则表达式的库oniguruma(http://www.geocities.jp/kosako3/oniguruma/),对于东亚文字支持比较好,开始是用在ruby上,也可用于C++,是日本的开发人员编写的。大多数人都不会用到,也就不做介绍了。如果有疑问可以通过email来讨论它的用法。

5、Regular Expression的内部实现
关于Regular Expression的实现,用到了不少自动机理论(Automata Theory)的知识,有兴趣的可以找这方面的资料来看,这本书“ Introduction to Automata Theory, Languages, and Computation”写的很好,编译原理的书也有这方面的内容。


#include <stdio.h>#include <string.h>#include <regex.h>#define SUBSLEN 10              /* sub mathced string buffer len*/#define EBUFLEN 128             /* err buffer */#define BUFLEN 1024             /* .......buffer.. */
int match_specifiedpattern(char* szSrc){size_t len;regex_t re;regmatch_t subs [SUBSLEN];char szmatched[BUFLEN];char szerrbuf[EBUFLEN];int err, i;//char szSrc[] = "XXX_bak";char szPattern[] = "^[a-zA-Z]+_(replace[0-9]?_)?(bak|old|old2|NG)$";// complieerr = regcomp(&re, szPattern, REG_EXTENDED);if(err){len = regerror(err, &re, szerrbuf, sizeof(szerrbuf));printf("error: regcomp: %s\n", szerrbuf);return 1;}printf("Total has subexpression: %d\n", re.re_nsub);// matcherr = regexec(&re, szSrc, (size_t) SUBSLEN, subs, 0);// failif (err == REG_NOMATCH){printf("Sorry, no match ...\n");regfree(&re);return 0;}else if(err){len = regerror(err, &re, szerrbuf, sizeof(szerrbuf));printf("error: regexec: %s\n", szerrbuf);regfree(&re);return 1;}// successprintf("\nOK, has matched ...\n\n");for (i = 0; i <= re.re_nsub; i++) {len = subs[i].rm_eo - subs[i].rm_so;if (i == 0){printf ("begin: %d, len = %d  ", subs[i].rm_so, len);}else{printf("subexpression %d begin: %d, len = %d  ", i, subs[i].rm_so, len); }memcpy (szmatched, szSrc + subs[i].rm_so, len);szmatched[len] = '\0';printf("match: %s\n", szmatched);}regfree(&re); return 0;}


原创粉丝点击