2015-01-02 2 views
1

Я пишу парсер, анализирующий содержимое, переданное в параметре, и сравниваемое с регулярным выражением. Этот анализатор должен возвращать логическое значение, если найдена структура переменной:Соответствие регулярных выражений в C

int a;

double abc;

испытание на удар;

Эти переменные должны совпадать, но не ...

Вот мой код, я думал, что мое регулярное выражение верно ..

#include "includes.h" 

int check_match_var(char *str) 
{ 
    int err; 
    int match; 
    regex_t preg; 
    char err_buf[BUFSIZ]; 
    const char *regex = "/^(int|char|float|double) [a-zA-Z0-9]{1,};/"; 

    err = regcomp(&preg, regex, 0); 
    printf("Err : %d\n", err); 
    if (err == 0) 
    { 
     match = regexec(&preg, str, 0, NULL, 0); 
     regfree(&preg); 
     if (match == 0) 
    printf("Match !\n"); 
     else 
    printf("No match !\n"); 
    } 
    else 
    { 
     regerror(err, &preg, err_buf, BUFSIZ); 
     printf("regcomp: %s\n", err_buf); 
     return (1); 
    } 
    return (0); 
} 

int marvin(char **av) 
{ 
    check_match_var(av[1]); 
    return (0); 
} 

int main(int ac, char **av) 
{ 
    if (ac == 2) 
    { 
     marvin(av); 
    } 
    else 
    printf("\n"); 
    return (0); 
} 

Во всяком случае, возвращает 1 (без спички), я хочу он вернется 0 (матч) ..

Включает файл:

#ifndef INCLUDES_H_ 

#define INCLUDES_H_ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <regex.h> 
#endif 

Спасибо за помощь

+2

Я не думаю, что регулярные выражения POSIX хотят иметь ведущие/конечные символы '/' - они могут рассматриваться как часть фактического шаблона регулярного выражения. –

+0

Я добавил их после ошибки, пытаясь увидеть, что-то изменилось. – Teldar

+0

В качестве основного этапа отладки распечатайте искомую строку, чтобы убедиться, что программа получила то, что, по вашему мнению, получила. –

ответ

2

Код содержит код регулярного выражения POSIX от <regex.h>. Вы можете найти информацию о regcomp() и regexec() онлайн.

Есть две проблемы с кодом размещены:

  1. Paul Roub правильно identified, что косые в регулярное выражение строки не требуется.

  2. Jonathan Leffler правильно identified, что регулярные выражения обрабатываются regcomp() и regexec() являются «основными регулярными выражениями» или BRE, но запись пытаются использовать «расширенные регулярные выражения» или ERE. И способ запросить поддержку ERE - через флаг REG_EXTENDED как один из флагов в третьем аргументе до regcomp().

В comment, user3486006 подтверждает, что оба изменения (и добавления REG_NOSUB к regcomp()) означает, что он работает. См. Страницу руководства для REG_NOSUB; матч работал бы с флагом или без него, но добавление флага в этом контексте разумно.

Сообщество Ответ на Wiki: если Пол отправляет ответ, примите его, пожалуйста.

Смежные вопросы