Привтествую В общем сабж. В регуляке требуется только поддержка "?" и "*" Как реализовать алгоритм? Конкретно нужно: Какие взять состояния для автомата, что взять за входной сигнал саму строку, или строку регулярки???
Rustem http://ru.wikipedia.org/wiki/Построение_синтаксического_анализатора_на_основе_автоматного_подхода
Блин, там опять теория, как её применить к конкретной задаче? Без внешних либ. На чистом С. Дана строка char *s; Дана регулярка char *pattern; Надо: удовлетворяет ли строка регулярке. Не прошу конкретного решения, подскажите как надо делать...
Rustem, а в чём конкретно трудности? Для ? и * там достаточно знать как работать с циклами, условиями и массивами. С чем проблемы в реализации?
есть переменная - state есть входная буква - с Код (Text): while(c = get_c) { switch(state) { case 1: if(c == 'a') state =2; case 2: if(c == 'b') state = 1; } } типа по текущему состоянию и входному символу определяешь, куда идти дальше. Если у тебя регулярка, я так понимаю, надо добавлять память к автомату, то есть запоминать предыдущие символы, иначе aaab и aab для a*b не различить. ps. народ, извините пожалуйста за плохой вид сообщения, ничего не получается сделать.
с ? все просто. с * потяжельше чуток. для начала упростить паттерн, чтобы исключить ситуации типа "***", "*?", "?*" и тп. получаем упрощенный паттерн, при встрече * берем последующий символ паттерна (это не * и не ? гарантированно) и ищем его. нашли - тогда проверяем далее соответствие паттерну. если не соответствует, возвращаемся к последней * и ищем снова следующий символ паттерна, начиная от ранее найденного и т.п. код писать лениво. впрочем, когда-то помнится делал нечто подобное. но 100% не найду т.к. винт со старыми исходниками и доками ушел в небытие (
Код (Text): BOOL PatternMatch(const char* s, const char* mask) { const char* cp=0; const char* mp=0; for (; *s&&*mask!='*'; mask++,s++) if (*mask!=*s&&*mask!='?') return 0; for (;;) { if (!*s) { while (*mask=='*') mask++; return !*mask; } if (*mask=='*') { if (!*++mask) return 1; mp=mask; cp=s+1; continue; } if (*mask==*s||*mask=='?') { mask++, s++; continue; } mask=mp; s=cp++; } } Код взят с rsdn.ru