regex.h: вывести подвыражение - PullRequest
3 голосов
/ 20 июля 2010

Я хочу извлечь подстроку из моего выражения, используя библиотеку regex.h на C. Вот код

#include <regex.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   regex_t    preg;   
   char       *string = "Random_ddName:cateof:Name_Random";

   char       *pattern = ".*Name:\\(.*\\):Name.*";
   int        rc;     
   size_t     nmatch = 1;
   regmatch_t pmatch[1];

   if (0 != (rc = regcomp(&preg, pattern, 0))) {
      printf("regcomp() failed, returning nonzero (%d)\n", rc);
      exit(EXIT_FAILURE);
   }

   if (0 != (rc = regexec(&preg, string, nmatch, pmatch, 0))) {
      printf("Failed to match '%s' with '%s',returning %d.\n",
      string, pattern, rc);
   }
   else {  
      printf("With the whole expression, "
             "a matched substring \"%.*s\" is found at position %d to %d.\n",
             pmatch[0].rm_eo - pmatch[0].rm_so, &string[pmatch[0].rm_so],
             pmatch[0].rm_so, pmatch[0].rm_eo - 1);
   }
   regfree(&preg);

    return 0;
}

Я хочу извлечь строку "cateof", но я хочу быть уверен, чтонаходится между строками Name: и: Name.Cateof является случайным, он изменяется динамически, и это единственная часть, которая мне нужна.Как я могу получить это сразу?Можно ли использовать обратные ссылки для хранения нужного мне значения?

1 Ответ

5 голосов
/ 20 июля 2010

Вы должны указать nmatch = 2, чтобы pmatch[0] содержал все совпадения и pmatch[1] требуемый субматч.

Необходимые изменения кода:

size_t     nmatch = 2;
regmatch_t pmatch[2];

и

...
    pmatch[1].rm_eo - pmatch[1].rm_so, &string[pmatch[1].rm_so],
    pmatch[1].rm_so, pmatch[1].rm_eo - 1);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...