Posix регулярное выражение в C - PullRequest
1 голос
/ 19 декабря 2011

Я работаю над этим кодом, где мне нужно скомпилировать регулярное выражение и использовать эти скомпилированные версии несколько раз в разных строках. Поэтому я решил создать функцию, в которой я мог бы передать скомпилированную версию для сопоставления строки. Моя проблема заключается в том, что когда я передаю скомпилированную версию в функцию, она показывает совпадение, но устанавливает для полей структуры regmatch_t значение 0. Однако если я использую их в той же функции, я получаю правильные результаты.

void match_a(regex_t *a,char *str)
{
  regmatch_t match_ptr;
  size_t nmatch;
  regexec(a,str,nmatch,&match_ptr,0);
}
int main()
{
  regex_t a;
  regmatch_t match_ptr;
  size_t nmatch;
  char *str="acbdsfs";
  regcomp(&a,str,RE_EXTENDED);
  match_a(&a,str);
}

Это общая структура кода. Пожалуйста, предложите любые способы отладки этой программы

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Я не уверен, что вы понимаете, как использовать regexec. Аргумент nmatch сообщает regexec количество предоставленных вами regmatch_t объектов. Вы не инициализировали переменную nmatch, так что это может быть любое неопределенное значение, которое на некоторой стадии может привести к сбою, или это может быть 0, в этом случае функция regexec определена как игнорировать аргумент pmatch.

Если вам нужен только один regmatch_t результат, попробуйте это:

void match_a(regex_t *a,char *str)
{
    regmatch_t match;
    size_t nmatch = 1;

    regexec(a, str, nmatch, &match, 0);
}

Если вы хотите до 10 regmatch_t (для регулярных выражений с группами и т. Д.), Попробуйте это:

void match_a(regex_t *a,char *str)
{
    regmatch_t matches[10];
    size_t nmatch = 10;

    regexec(a, str, nmatch, matches, 0);
}

Для получения дополнительной информации прочитайте эту документацию .

0 голосов
/ 23 марта 2012

Почему совпадения не заполнены в позиции 1?

    regex_t a;
    regcomp(&a,"brasil",REG_ICASE);

    regmatch_t matches[2];
    size_t nmatch = 2;
    regexec(&a,"brasil brasil",nmatch,matches,0);

    int x;
    for(x=0;x<2;x++)
            printf("%i\n",matches[x].rm_so);
...