繁体   English   中英

带多个子字符串的PCRE正则表达式

[英]PCRE regex with multiples substrings

我想从此行中获取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;
}

但是它不会返回第一组。

你能告诉我我的正则表达式是否好吗?

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

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

另外,如果要捕获,则必须在不使用REG_NOSUB情况下编译正则表达式:

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

...而此时printf可能会对您进行隔离; 参数与格式字符串不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM