Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PCRE: получение всех совпадений 
V
    Опции темы
Alca
Дата 28.2.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Пишу на СИ (C99), Kubuntu. PCRE 8.02 (2010-03-19)
Число совпадений должно быть 3, а не 1. (хотя с имейлами все гуд)
Код

#include <stdio.h>
#include <stdlib.h>
#include <pcre.h>
//----------------------------------------------------------------------------------------------------
struct SResponseMemory {
    char   *pszMemory;      
    size_t  uiSize;
};
typedef struct SResponseMemory SResponseMemory;

int
bTest(const SResponseMemory *pcrmResponseContent, const char *pcszRegExpr);
//----------------------------------------------------------------------------------------------------
int
main() {
    SResponseMemory crmResponseContent;

    //!!!здесь лажа!!!
    //crmResponseContent.pszMemory = "__test__test__test__";
    //crmResponseContent.uiSize    = strlen(crmResponseContent.pszMemory);
    //
    //const char cszRegExpr[]      = "test";

    //здесь ок
    //crmResponseContent.pszMemory = "From:[email protected]_From:[email protected]_From:[email protected]";
    //crmResponseContent.uiSize    = strlen(crmResponseContent.pszMemory);
    //
    //const char  cszRegExpr[]     = "From:([^@]+)@([^\r]+)";

    //здесь ок
    //crmResponseContent.pszMemory = "regular expressions=very cool";
    //crmResponseContent.uiSize    = strlen(crmResponseContent.pszMemory);

    //const char  cszRegExpr[]     = "([^=]*)=(.*)";

    bTest(&crmResponseContent, cszRegExpr);

    return EXIT_SUCCESS;
}
//----------------------------------------------------------------------------------------------------
int
bTest(const SResponseMemory *pcrmResponseContent, const char *pcszRegExpr) {
    pcre       *preRegExpr = NULL;
    int         iOptions   = PCRE_CASELESS | PCRE_DOTALL | PCRE_MULTILINE;
    const char *cpszError  = NULL;
    int         iErrOffset = 0;

    //--------------------------------------------------
    //compile
    preRegExpr = pcre_compile (    /* http://www.manpagez.com/man/3/pcre_compile/ */
            pcszRegExpr,
            iOptions,
            &cpszError,
            &iErrOffset,
            NULL);

    if (NULL == preRegExpr) { // в случае ошибки компиляции
       printf("Failed\n");

       return EXIT_FAILURE;
    }

    //--------------------------------------------------
    //execute
    int iCount = 0;
    int aiOutVector[30];

    iCount = pcre_exec(  /*http://www.manpagez.com/man/3/pcre_exec/*/
               preRegExpr,
               NULL,
               pcrmResponseContent->pszMemory,
               pcrmResponseContent->uiSize,
               0,
               0,
               aiOutVector, 30);
    printf("iCount: %i\n", iCount);    // iCount всегда равен 1, почему? хотя должен быть равным 3

    //...

    return EXIT_SUCCESS;
}
//---------------------------------------------------------------------------


http://www.pcre.ru/eval/es%40%3D%23%3D%401...__test___test_/

Это сообщение отредактировал(а) Alca - 1.3.2011, 19:36


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 1.3.2011, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Кажеться это из-зи флага PCRE_GLOBAL (http://web.cecs.pdx.edu/~postj/contest/pcregsub.html).
Но в pcre.h такого флага нет.  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 2.3.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Короче надо циклить pcre_exec

http://stackoverflow.com/questions/1421785...ll-match-groups

Это сообщение отредактировал(а) Alca - 2.3.2011, 14:02


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.