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

标签 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))";

然后运行它会出现段错误。

可能出了什么问题?

最佳答案

您需要检查 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;
}

您将得到前面的正则表达式无效

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

关于c - 复杂正则表达式的段错误 - Regex.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22567118/

相关文章:

c++ - 计算出内存地址指向的值

c - xmlReadMemory 不保留原始格式的空节点

java - 具有多个匹配的正则表达式不起作用

c - 将值添加到结构数组会导致段错误

c++ - Opengl-es 2.0中渲染三角形的问题

c++ - 如何在 ARM 的 IAR 嵌入式工作台中编译包含 C 和 C++ 源文件的项目?

python - python正则表达式中的贪婪反向引用?

.net - 为什么我无法匹配 POSIX 字符类

c - linux 上的 memcpy 段错误,但 os x 上没有

c - 递归段错误和 StackGuard