具有多个子串的PCRE正则表达式

时间:2014-11-29 23:37:19

标签: regex pcre

我想从这一行得到2个子串:

  

open(“/ etc / ld.so.cache”,O_RDONLY | O_CLOEXEC)= 3

首先我要/etc/ld.so.cache,第二/etc/ld.so.cache

所以我写了这个

int main()
{

    char * line = "open(\"/etc/ld.so.cache\", O_RDONLY|O_CLOEXEC) = 3";

    int         rc;
    size_t      nmatch = 3;

    regex_t     reg;
    regmatch_t  pmatch[3];

    char * regex = "open\(\"\\([^\"]*\\)\",[ ]\\([^\)]*\\)\).*";

    rc = regcomp(&reg, regex, REG_NOSUB | REG_EXTENDED);

    rc = regexec(&reg, line, nmatch, pmatch, 0);
    if (!rc) {
            printf("Matched substring \"%.*s\" is found at position %d to %d.\n",
                     pmatch[1].rm_eo - pmatch[1].rm_so, &line[pmatch[1].rm_so],
                     pmatch[1].rm_so, pmatch[1].rm_eo - 1);

    }

    regfree(&reg);

    return 0;
}

但它没有返回第一组。

你能告诉我,如果我的正则表达式好吗?

1 个答案:

答案 0 :(得分:1)

近。在POSIX正则表达式中,如果您希望它们与自身匹配,则必须转义括号和其他特殊字符,而不是访问它们的特殊功能,因此它必须是

char const * regex = "open\\(\"([^\"]*)\", *([^\\)]*)\\).*";

此外,如果您想要捕获,则必须在没有REG_NOSUB的情况下编译正则表达式:

rc = regcomp(&reg, regex, REG_EXTENDED);

...而printf目前可能会对你进行分段攻击;参数与格式字符串不匹配。