复杂正则表达式的分段错误 – Regex.h
我试图在一大块文本中找到URL
regex_t reg; const char *regex="REGEXGOESHERE"; regmatch_t matches[16]; //Read data into variable filecontent regcomp(®, regex, REG_EXTENDED); int offset=0; int j; int found=0; int start,end; while( regexec(®, 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(®, regex, REG_EXTENDED); if (ret != 0) { regerror(ret, ®, err, 1024); printf("%s\n", err); return 1; } regfree(®); return 0; }
您将获得Invalid preceding regular expression
原因是(?:
POSIX正则表达式不支持,甚至是扩展的正则表达式。