2011-12-19 8 views
1

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

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); 
} 

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

+0

Это может помочь установить 'nmatch' в разумное значение и, возможно, предоставить массив' regmatch_t', способный удерживать более одного результата. –

ответ

2

я не уверен, вы знаете, как пользоваться 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); 
} 

Для более информацию, читайте this documentation.

+0

Thaks для информации. Я думал о компиляции регулярного выражения только один раз, а затем вызывал match_a несколько раз для разных значений str. Я думаю, что мы не можем этого сделать и должны каждый раз обновлять его для новой строки и скомпилировать ее снова –

+0

@mayank_gupta: Нет, вы можете сохранить переменную 'regex_t' и использовать ее снова и снова, с этим нет никаких проблем. – dreamlax

+0

Спасибо. Я попытался повторно использовать regex_t, выполнив функцию соответствия, но проблема, с которой я столкнулся, заключается в том, что я получаю segfault после выполнения regexec с переданной переменной regex_t. Это может быть глупая ошибка, которую я застрял на ней с некоторого времени. пожалуйста, помогите –

-1

Почему матчи не заполнены в позиции 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); 
+0

, пожалуйста, опубликуйте новый вопрос, а не отметьте предыдущий вопрос – imp25