我可以使用C中的正则表达式库来匹配模式。可以打印匹配的单词。但是,我需要将匹配存储到字符串或char数组中。代码如下:
void match(regex_t *pexp, char *sz) {
regmatch_t matches[MAX_MATCHES]; //A list of the matches in the string (a list of 1)
if (regexec(pexp, sz, MAX_MATCHES, matches, 0) == 0)
{
printf("%.*s\n", (int)(matches[0].rm_eo - matches[0].rm_so), sz + matches[0].rm_so);
}
else {
printf("\"%s\" does not match\n", sz);
}
}
int main() {
int rv;
regex_t exp;
rv = regcomp(&exp, "-?([A-Z]+)", REG_EXTENDED);
if (rv != 0) {
printf("regcomp failed with %d\n", rv);
}
match(&exp, "456-CCIMI");
regfree(&exp);
return 0;
}
OR可能就是我需要这个。我如何在C中拼接char数组?即。如果char数组有" ABCDEF" 6个字符。我只需要索引2中的字符索引5" CDEF"。
答案 0 :(得分:3)
对于您提供的示例,如果您需要-CCIMI
,则可以
strncpy(dest, sz + matches[0].rm_so, matches[0].rm_eo - matches[0].rm_so);
但是既然你在模式中使用了group,我猜你真正想要的只是CCIMI
。你可以
strncpy(dest, sz + matches[1].rm_so, matches[1].rm_eo - matches[1].rm_so);
在 strncpy()
之前,请为 dest
答案 1 :(得分:1)
您可以使用memcpy
将匹配的字符串复制到数组中,或者动态分配字符串:
char *dest;
/* your regexec call */
dest = malloc(matches[0].rm_eo - matches[0].rm_so + 1); /* +1 for terminator */
memcpy(dest, sz + matches[0].rm_so, matches[0].rm_eo - matches[0].rm_so);
dest[matches[0].rm_eo - matches[0].rm_so] = '\0'; /* terminate the string */
在上面的代码之后,dest
指向匹配的字符串。
答案 2 :(得分:0)
如果您正在寻找字符串函数,也可以使用strncpy。
strncpy(dest, sz + matches[0].rm_so, matches[0].rm_eo - matches[0].rm_so);