поиск соответствия строки регулярному выражению и конечные автоматы

Тема в разделе "LANGS.C", создана пользователем Rustem, 28 июн 2007.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Привтествую
    В общем сабж. В регуляке требуется только поддержка "?" и "*"
    Как реализовать алгоритм?

    Конкретно нужно:
    Какие взять состояния для автомата, что взять за входной сигнал саму строку, или строку регулярки???
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Блин, там опять теория, как её применить к конкретной задаче? Без внешних либ. На чистом С.
    Дана строка char *s;
    Дана регулярка char *pattern;
    Надо: удовлетворяет ли строка регулярке.
    Не прошу конкретного решения, подскажите как надо делать...
     
  4. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Rustem, а в чём конкретно трудности? Для ? и * там достаточно знать как работать с циклами, условиями и массивами. С чем проблемы в реализации?
     
  5. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    есть переменная - state
    есть входная буква - с
    Код (Text):
    1. while(c = get_c)
    2. {
    3.   switch(state)
    4.   {
    5.      case 1:
    6.         if(c == 'a')  
    7.             state =2;
    8.      case 2:
    9.        if(c == 'b')
    10.              state = 1;
    11.  }
    12. }
    типа по текущему состоянию и входному символу определяешь, куда идти дальше.
    Если у тебя регулярка, я так понимаю, надо добавлять память к автомату, то есть запоминать предыдущие символы, иначе aaab и aab для a*b не различить.

    ps. народ, извините пожалуйста за плохой вид сообщения, ничего не получается сделать.
     
  6. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    с ? все просто.
    с * потяжельше чуток. для начала упростить паттерн, чтобы исключить ситуации типа "***", "*?", "?*" и тп.
    получаем упрощенный паттерн, при встрече * берем последующий символ паттерна (это не * и не ? гарантированно) и ищем его.
    нашли - тогда проверяем далее соответствие паттерну. если не соответствует, возвращаемся к последней * и ищем снова следующий символ паттерна, начиная от ранее найденного и т.п.


    код писать лениво. впрочем, когда-то помнится делал нечто подобное. но 100% не найду т.к. винт со старыми исходниками и доками ушел в небытие (
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Rustem
    то есть поиск по маске?
     
  8. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Код (Text):
    1. BOOL PatternMatch(const char* s, const char* mask)
    2. {
    3.     const   char* cp=0;
    4.     const   char* mp=0;
    5.   for (; *s&&*mask!='*'; mask++,s++) if (*mask!=*s&&*mask!='?') return 0;
    6.   for (;;) {
    7.     if (!*s) { while (*mask=='*') mask++; return !*mask; }
    8.     if (*mask=='*') { if (!*++mask) return 1; mp=mask; cp=s+1; continue; }
    9.     if (*mask==*s||*mask=='?') { mask++, s++; continue; }
    10.     mask=mp; s=cp++;
    11.   }
    12. }
    Код взят с rsdn.ru
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    boost::regex?
     
  10. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    В принципе можно и без автоматов, если это проще получается

    Спасибо всем за ответы
     
  11. yGREK

    yGREK New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2005
    Сообщения:
    5
    Адрес:
    Ukraine
    Хорошая статья по теме : http://swtch.com/~rsc/regexp/regexp1.html
     
  12. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    yGREK
    Спасибо
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Можно. Смотри исходный код FindFirstFileEx.
     
  14. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Просто еще интересно как это на автоматах делается