C的正则匹配

http://see.xidian.edu.cn/cpp/html/1428.html

上述网址有关于C的正则匹配用法,或者百度、google搜索“C正则”也能找到为数不多的用法介绍。这里补充一点,就是C的正则表达式传递进去的时候,不可以加//来包围正则,自然也不支持如/[a-z]+/i,它是通过regcomp进行编译的,如果要忽略大小写,编译时设置标记为REG_ICASE即可。

另外还要注意正则表达式中如果要包括"-",那么把它写在最后,或最前,否则会当成a-z这种范围来计算的,regcomp编译无法通过,会提示"nvalid range end”,当然这个信息要通过regerror 来获取。

 

下面附上可用的代码:

 

#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <regex.h>

int main(int argc, char **argv)
{
	int errcode, status, i, j;
	int cflags = REG_EXTENDED | REG_ICASE;
	regmatch_t pmatch[3];
	const size_t nmatch = 3;
	regex_t reg;
	const char *pattern = "([a-z0-9._-]+)@([a-z0-9._-]+)";
	char *buf = "[email protected]";
	char err_buf[128] = {0};

	if (0 != (errcode = regcomp(&reg, pattern, cflags))) {
		regerror (errcode, &reg, err_buf, sizeof err_buf);
		printf("Error while regcomp: %s\n", err_buf);
		return -1;
	}
	status = regexec(&reg, buf, nmatch, pmatch, 0);
	if (REG_NOMATCH == status)
		printf("No Match\n");
	else if (0 == status) {
		printf("Match:\n");
		for (j=0; j<3; j++) {
			printf("[%d]:", j+1);
			for (i=pmatch[j].rm_so; i<pmatch[j].rm_eo; ++i) 
				putchar(buf[i]);
			printf("\n");
		}
	}
	regfree(&reg);

	return 0;
}

 

你可能感兴趣的:(正则)