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

^[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)$";
	
	// 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值