我正在尝试在大块文本中找到网址
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
中的简单正则表达式,例如regex = "https?.*.png"
。但是,如果我想要一个像(https?:\/\/.*\.(?:png|jpg))
这样的URL的复杂正则表达式,我必须转义反斜杠,因此它变为:
"(https?:\\/\\/.*\\.(?:png|jpg))";
然后运行它会产生分段错误。
可能出现什么问题?
答案 0 :(得分:1)
您需要检查regcomp的返回,它会告诉您正则表达式无效。
#include <regex.h>
#include <stdio.h>
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正则表达式不支持,甚至是扩展名。