我想从这一行得到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(®, regex, REG_NOSUB | REG_EXTENDED);
rc = regexec(®, 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(®);
return 0;
}
但它没有返回第一组。
你能告诉我,如果我的正则表达式好吗?
答案 0 :(得分:1)
近。在POSIX正则表达式中,如果您希望它们与自身匹配,则必须转义括号和其他特殊字符,而不是访问它们的特殊功能,因此它必须是
char const * regex = "open\\(\"([^\"]*)\", *([^\\)]*)\\).*";
此外,如果您想要捕获,则必须在没有REG_NOSUB
的情况下编译正则表达式:
rc = regcomp(®, regex, REG_EXTENDED);
...而printf
目前可能会对你进行分段攻击;参数与格式字符串不匹配。