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

时间:2014-03-21 18:46:45

标签: c regex segmentation-fault

我正在尝试在大块文本中找到网址

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中的简单正则表达式,例如regex = "https?.*.png"。但是,如果我想要一个像(https?:\/\/.*\.(?:png|jpg))这样的URL的复杂正则表达式,我必须转义反斜杠,因此它变为:

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

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

可能出现什么问题?

1 个答案:

答案 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(&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正则表达式不支持,甚至是扩展名。