Регулярные выражения.

Тема в разделе "LANGS.C", создана пользователем asd, 13 апр 2007.

  1. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Подскажите пожалуйста, кто разбирается. Есть код
    Код (Text):
    1.    #include <iostream.h>
    2.    #include <pcre.h>
    3.    int main(){
    4.       char pattern[] = "e";
    5.       char str[] = "test";
    6.       const unsigned char *tables = NULL;
    7.       setlocale (LC_CTYPE, (const char *) "ru.");
    8.       tables = pcre_maketables();
    9.       pcre *re;
    10.       int options = 0;
    11.       const char *error;
    12.       int erroffset;
    13.       re  =  pcre_compile ((char *) pattern, options, &error, &erroffset, NULL);
    14.       if (!re){
    15.          cout << "Failed\n";
    16.       }
    17.       else{
    18.          int count = 0;
    19.          int ovector[30];
    20.          count  =  pcre_exec  (re,  NULL, (char *) str, sizeof str, 0, 0, ovector, 30);
    21.          if (!count){
    22.             cout << "No match\n";
    23.          }
    24.          else{
    25.             for (int c = 0; c < 2 * count; c += 2){
    26.                if (ovector[c] < 0){
    27.                   cout << "<unset>\n";
    28.                }
    29.                else{
    30.                   cout << ovector[c] << "/" << ovector[c + 1] << "\n";
    31.                }
    32.             }
    33.          }
    34.       }
    35.       return 0;
    36.  }
    хорошо находит позицю буквы "е". Но если искать в строке, к примеру, "testerere" - то находит за 1 раз только 1 "е" и никак не хочет заполнить массив ovector всеми найденными совпадениями. Может какие флаги поставить?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Смотри доку pcre, как включить глобальный поиск ('teste' =~ /e/g).
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Угу, видел я это, только уже сутки, как не могу понять как её заюзать:dntknw:
     
  4. ShadOS

    ShadOS New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    39
    Адрес:
    0x48k
    С ходу могу предложить замещать уже найденные символы (подстроки) какими-либо другими нечитаемыми символами, запоминать позиции и заново повторять поиск. Но что-то подсказывает мне что есть вариант проще.
     
  5. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    ShadOS Вариант проще - научиться пользоваться ключом /g :) Я уж и обёртку свою написал, которая что нужно делает, но всё равно Научиться нужно.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Читаем всё же доку.
     
  7. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    IceStudent И правда:)
    Английский учить нужно:dntknw: