^[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
#include
#include
#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)$";
// complie
err = 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);
// match
err = regexec(&re, szSrc, (size_t) SUBSLEN, subs, 0);
// fail
if (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;
}
// success
printf("\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;
}