Я пытаюсь извлечь строку из другого использования 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(®ex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
printf("regcomp error\n");
status = regexec(®ex, av[1], 1, pmatch, 0);
regfree(®ex);
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(®ex, av[1], 1, pmatch, 0);
становится regexec(®ex, av[1], 2, pmatch, 0);
Спасибо :)
Как вы заметили, 0-й элемент массива pmatch структур regmatch_t будет содержать границы всей сопоставленной строки. В вашем примере вас интересует regmatch_t с индексом 1, а не с индексом 0, чтобы получить информацию о совпадениях строк по подвыражению.
Если вам нужна дополнительная помощь, попробуйте отредактировать свой вопрос, включив в него реальный небольшой образец кода, чтобы людям было легче определить проблему.