复杂正则表达式的分段错误 – Regex.h

我试图在一大块文本中找到URL

regex_t reg; const char *regex="REGEXGOESHERE"; regmatch_t matches[16]; //Read data into variable filecontent regcomp(&reg, regex, REG_EXTENDED); int offset=0; int j; int found=0; int start,end; while( regexec(&reg, filecontent+offset, 16, matches, 0) == 0) { printf("\n\n"); start = matches[0].rm_so+offset; end = matches[0].rm_eo-1+offset; printf("regex /%s/ at bytes %d-%d\n", regex, start, end); for (j=start; j<=end; j++) { printf("%c",filecontent[j]); } offset += matches[0].rm_eo; found = 1; } close(f); 

现在这适用于const char * regex一个简单正则const char * regex ,比如说regex = "https?.*.png" 。 但是,如果我想要一个像(https?:\/\/.*\.(?:png|jpg))这样的URL的复杂正则表达式,我必须转义反斜杠,因此它变为:

 "(https?:\\/\\/.*\\.(?:png|jpg))"; 

然后运行它会产生分段错误。

可能出了什么问题?

您需要检查regcomp的返回,它会告诉您正则表达式无效。

 #include  #include  int main() { regex_t reg; const char *regex="(https?:\\/\\/.*\\.(?:png|jpg))"; regmatch_t matches[16]; int ret; char err[1024]; //Read data into variable filecontent ret = regcomp(&reg, regex, REG_EXTENDED); if (ret != 0) { regerror(ret, &reg, err, 1024); printf("%s\n", err); return 1; } regfree(&reg); return 0; } 

您将获得Invalid preceding regular expression

原因是(?: POSIX正则表达式不支持,甚至是扩展的正则表达式。