Как Вы получаете группу с regex?

Я пытаюсь извлечь строку из другого использования regex. Я использую POSIX regex функции (regcomp, regexec ...), и я перестал работать при получении группы...

Например, позвольте шаблону быть чем-то столь же простым как "MAIL FROM:<(.*)>"
REG_EXTENDED cflags)

Я хочу получить все между' <' и'>'

Моя проблема - это regmatch_t дает мне границы целого шаблона (ПОЧТА ОТ: <...>) вместо, что между круглой скобкой...

Что я пропускаю?

Заранее спасибо,

править: некоторый код

#define SENDER_REGEX "MAIL FROM:<(.*)>"

int main(int ac, char **av)
{
  regex_t regex;
  int status;
  regmatch_t pmatch[1];

  if (regcomp(&regex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
    printf("regcomp error\n");
  status = regexec(&regex, av[1], 1, pmatch, 0);
  regfree(&regex);
  if (!status)
      printf(  "matched from %d (%c) to %d (%c)\n"
             , pmatch[0].rm_so
             , av[1][pmatch[0].rm_so]
             , pmatch[0].rm_eo
             , av[1][pmatch[0].rm_eo]
            );

  return (0);
}

выводы:

$./a.out "012345MAIL FROM:<abcd>$"
matched from 6 (M) to 22 ($)

решение:

как RarrRarrRarr заявил, индексы находятся действительно в pmatch[1].rm_so и pmatch[1].rm_eo
следовательно regmatch_t pmatch[1]; становится regmatch_t pmatch[2];
и regexec(&regex, av[1], 1, pmatch, 0); становится regexec(&regex, av[1], 2, pmatch, 0);

Спасибо :)

23
задан Justin Johnson 5 April 2010 в 07:00
поделиться

1 ответ

Как вы заметили, 0-й элемент массива pmatch структур regmatch_t будет содержать границы всей сопоставленной строки. В вашем примере вас интересует regmatch_t с индексом 1, а не с индексом 0, чтобы получить информацию о совпадениях строк по подвыражению.

Если вам нужна дополнительная помощь, попробуйте отредактировать свой вопрос, включив в него реальный небольшой образец кода, чтобы людям было легче определить проблему.

10
ответ дан 29 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: