C编程 - 正则表达式匹配和存储在字符串中

时间:2014-04-03 10:44:35

标签: c regex arrays

我可以使用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"。

3 个答案:

答案 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

执行malloc足够的空间

答案 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);