linux c 语言 正则表达式

文章定位:初学者写坑

关于正则表达式的基础,请参考 http://rubular.com/ 

关于函数解释,请参考 http://man7.org/linux/man-pages/man3/regex.3.html

自己写了段小代码,从URL中提取处主机域名和剩余部分。

#include
#include
#include
#include

int main(int argc, char **argv)	//传入待匹配字符串
{
	if(argc < 2){	//输入错误
		puts("bad input");
		return 0;
	}

	regmatch_t pmatch[100];	//匹配结果
	regex_t reg;
	char * pattern = "(https?:(//)?)?([^/]*)(.*)"; //正则表达式
	int i = 0;
	char buf[100];

	int res = regcomp(®, pattern, REG_EXTENDED | REG_NEWLINE); //将正则表达式编译成适合regexec执行的形式
	if(res) {	//出错,错误信息输出
		switch(res){
			default : puts("unknown regcomp error");break;
			case REG_BADBR: puts("REG_BADBR"); break;
			case REG_BADPAT: puts("REG_BADPAT"); break;
			case REG_BADRPT: puts("REG_BADRPT"); break;	
			case REG_EBRACE: puts("REG_EBRACE"); break;
			case REG_ECOLLATE: puts("REG_ECOLLATE"); break;
			case REG_ECTYPE: puts("REG_ECTYPE"); break;
			case REG_EEND: puts("REG_EEND"); break;
			case REG_EESCAPE: puts("REG_EESCAPE"); break;
			case REG_EPAREN: puts("REG_EPAREN"); break;
			case REG_ERANGE: puts("REG_ERANGE"); break;
			case REG_ESIZE: puts("REG_ESIZE"); break;
			case REG_ESPACE: puts("REG_ESPACE"); break;
			case REG_ESUBREG: puts("REG_ESUBREG"); break;
		}
		return 0;
	}

	regexec(®, argv[1], sizeof(pmatch)/sizeof(regmatch_t), pmatch, 0);	//正则匹配
	for(i = 0; i < 5 /*&& pmatch[i].rm_so != -1*/; i++) {
		strncpy(buf, argv[1] + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so);	//拷贝匹配到的串
		buf[pmatch[i].rm_eo - pmatch[i].rm_so] = '\0'; /的发现strncpy竟然不加'\0'
		printf("%d %d : %s\n", pmatch[i].rm_so, pmatch[i].rm_eo, buf);
	}

	regfree(®);	//释放正则编译时申请的空间
}
重点解释一下,regexec函数的返回值。

1. regexec返回第一个串是输入的、待匹配的串。后面是每个圆括号匹配到的串。(有些正则表达式可以用 ?: 关闭圆括号的捕获功能,然而,regcomp会报错为REG_BADRPT(误用通配符),如果您知道如何关闭圆括号的捕获功能,还望不吝赐教)。返回的总字符串数为圆括号数+1。

2. 返回的串用一个结构体表示,分别式匹配到的串在原始串中,开始和结束的后一个字符的位置。 如下:

 typedef struct {

  regoff_t rm_so;

  regoff_t rm_eo;

} regmatch_t ;

3. 如果某个圆括号没有匹配到字符串,则 rm_so和rm_eo都为-1。-1并不代表整个匹配的结束,只是对应位置的圆括号没有匹配到。 如果使用通配符,则未匹配到字符串时 rm_so 等于 rm_eo。

示例:(可执行文件名为 t )

linux c 语言 正则表达式_第1张图片

你可能感兴趣的:(语言)