Предложить C regex scanner (считыватель потока)

Я ищу библиотеку регулярных выражений в C/C ++, которая не предоставляет общее регулярное выражение API (строка, шаблон), а позволяет построить конечный конечный автомат (на основе шаблона), и я бы просто позвонил

fsm = create_fsm();
add_pattern(fsm, "foo", hookFoo);
add_pattern(fsm, "bar", hookBar);
compile_fsm(fsm);
while ((c = fgetc(file) != EOF) {
   next_char(fsm, c);
}

И если шаблон будет сопоставлен, будет вызван hookFoo (начало матча, конец матча)? Или что-то похожее на это, это только концепция. Я хотел бы искать несколько регулярных выражений в длинных, длинных линиях. В идеале, если он может быть заполнен также в обратном направлении для обратного поиска. Поскольку выражения известны только во время выполнения, Flex (или аналогичный генератор синтаксического анализатора) не является вариантом.

EDIT: Although I have marked lexertl as the right answer, it appears that it is not what I was looking for. It needs to go back the stream; I don't want to use memory for remembering the past (other than constant-sized such as rememebering the last character). Imagine it as when I call ++iterator all other iterators should be invalidated.

1
nl ja de
из любопытства, вы просите один в C/C ++. Знаете ли вы об одном для другого языка?
добавлено автор im so confused, источник
AK4749: Нет, я только что указал это, поскольку я хочу использовать его в приложении C ++. Но если вы знаете о какой-либо такой библиотеке на другом языке, не стесняйтесь комментировать. Java Scanner может быть полезен (поскольку он принимает потоки), хотя и не столь мощный.
добавлено автор Radim Vansa, источник
github.com/leblancmeneses/NPEG имеет итератор, который вы можете продлить и реализовать PEG - используйте языковой инструмент для экспортируйте дерево разбора.
добавлено автор Leblanc Meneses, источник

3 ответы

Похоже, lexertl долгий путь к вашим требованиям. Он поддерживает как добавление регулярных выражений во время выполнения, так и «перезапускаемый» лексер. Это даст вам знак для каждого признанного «правила».

boost::spirit::lex uses lexertl as a default implementation and it adds semantic actions.

2
добавлено
Хм, это похоже на хорошую посадку, поскольку он может принимать только итератор, а не всю строку. Я просто надеюсь, что это достаточно быстро со всем адским ООП ;-) Спасибо! Я посмотрю на это и проверю ваш ответ.
добавлено автор Radim Vansa, источник
Извините за снятие ответа, но см. Мой EDIT.
добавлено автор Radim Vansa, источник

You can develop your own functions using functions offered by #include like regcomp, and regexec

пример

int  match_patterns(char *pch,char *pattern)
{
    regex_t             *regex;
    regmatch_t          *result;
    int                 err_no = 0;
    int                 start = 0;

    regex = (regex_t *) calloc(1,sizeof(regex_t));
    if((err_no = regcomp(regex, pattern, REG_EXTENDED)) != 0)
    {
        size_t          length;
        char            *buffer;
        length = regerror (err_no, regex, NULL, 0);
        buffer = malloc(length);
        regerror (err_no, regex, buffer, length);
        free(buffer);
        regfree(regex);
        return -1; //error
    }
    result = (regmatch_t *) calloc(1,sizeof(regmatch_t));
    if(result == NULL)
    {
        return -1; //error
    }
    while(regexec(regex, pch+start, 1, result, 0) == 0)
    {
        start +=result->rm_eo;
    }
    regfree(regex);
    free(regex);
    if((result->rm_so == 0)&&(result->rm_eo == strlen(pch)))
    {
        return 0; //OK
    }
    return -1; //error
}

Эта функция вернет 0, если строка pch соответствует шаблону regexp pattern и возвращает -1 в противном случае.

пример

int main()
{
    if (match_patterns("1234.abc", "[0-9]+.[a-d]+")==0)
        printf("OK!\n");
    else
        printf("NOK!\n");

}

match_patterns() в этом случае вернет 0

Если вы используете эту функцию, не забудьте добавить следующий iclude:

#include
#include
1
добавлено
мой ответ - всего лишь пример того, как использовать функции, предлагаемые , и теперь вам решать начать работу над функциями, зависящими от ваших потребностей, а затем вернуться назад, если вы заблокированы, где в вашей функции
добавлено автор MOHAMED, источник
Спасибо за длинный ответ, но вы, вероятно, пропустили два важных качества, которые я ищу: 1) Я не могу получить целую цепочку (ту, которая указана pch в вашем коде) в памяти сразу, и я едва могу найти «границы», где строка может быть разделена. 2) Я не могу сразу совместить несколько регулярных выражений, а не искать их один за другим.
добавлено автор Radim Vansa, источник
И мой вопрос состоял в том, что библиотека регулярных выражений (cite), которая не предоставляет общий API, где можно рассматривать как обычный материал с регулярным выражением (строка, шаблон).
добавлено автор Radim Vansa, источник

После еще нескольких поисковых запросов я нашел библиотеку RE2 http://code.google.com/p/ re2/ - это заявленная быстрая реализация (со скоростью, сравнимой с grep или awk) с правильной теорией в фоновом режиме и может предлагать ограничения памяти. RE2 :: FindAndConsume кажется правильным API.

EDIT: Nope (again). FindAndConsume only finds incrementaly matches in one string but does not allow to pass multiple chunks of the data stream :( And by the way when the match is found the machine travels back to see where the match actually started (although this is not such a big problem as it shouldn't do that during forward search, as e.g. lexertl does.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest