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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск регулярками c либой pcre, получение результата 
:(
    Опции темы
lc0d3r
Дата 24.7.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.7.2008
Где: Киев

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



вот пишу поиск по регулярный выражениям.. написал функцию.. вот только она дает нулевое совпадение, а не именно то что ищем


Код

#include <stdio.h>
#include <pcre.h>
#include <string.h>

//-----------------------------------------------------------------------------------------------------
int * getStat (char* pattern, char* subject) {
    pcre *f;
    pcre_extra *f_ext;
    
    const char *errstr;
    int errchar;
    
    int vector[50];
    int vecsize=50;
    const char *buff2;
    
    int pairs;
    int i,j;
    
    int *res;
    if((f=pcre_compile(pattern,PCRE_CASELESS|PCRE_MULTILINE,&errstr,&errchar,NULL))==NULL) {
     printf("Error: %s\ncharacter N%i\ntemplate:%s\n",errstr,errchar,pattern);
     return NULL;
    }
    else {
        if((pairs=pcre_exec(f,NULL,subject,strlen(subject),0,PCRE_NOTEMPTY,vector,vecsize))<0){
         printf("Error! Number: %i\n",pairs);
        }
      else {
             
            f_ext=pcre_study(f,0,&errstr);
            j=0;
                        
          while((pairs=pcre_exec(f,f_ext,subject,strlen(subject),j,PCRE_NOTEMPTY,vector,vecsize))>=0){
                pcre_get_substring(subject,vector,pairs,0,&buff2);
                printf("%s\n",buff2);
                pcre_free_substring(buff2);
                j=vector[1]+1;
             }
             
          }     
            
      }
}    
//-----------------------------------------------------------------------------------------------------
int main(int argc, char* argv[]){
    int *tmp;
    
    tmp=getStat("<b>([0-9]+)<\\/b>", "asdfsa: sdfg<b>2</b> sfgdfasdasf<b>0</b> <br>");
/


    return 0;
}


дает на выходе 

Цитата

<b>2</b>
<b>0</b>


как сделать что бы получать именно результат, а не нулевой шаблон?

Цитата

2
0


p.s. функция не дописана поэтому и не возвращает массив инт * 
p.p.s. почему у меня код не подсвечивает? о_0 выделил в \[code=cpp\]

Это сообщение отредактировал(а) lc0d3r - 24.7.2008, 12:30
PM MAIL WWW   Вверх
lc0d3r
Дата 25.7.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.7.2008
Где: Киев

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



вообщем обошел проблему таким методом

Код

//-----------------------------------------------------------------------------------------------------
int * getStat (char* pattern, char* subject) {
    pcre *f;
    pcre_extra *f_ext;
    
    const char *errstr;
    int errchar;
    
    int vector[50];
    int vecsize=50;
    const char *buff2;
    
    int pairs;
    int i,j,z;
    
    int *res;
    if((f=pcre_compile(pattern,PCRE_CASELESS|PCRE_MULTILINE,&errstr,&errchar,NULL))==NULL) {
     printf("Error: %s\ncharacter N%i\ntemplate:%s\n",errstr,errchar,pattern);
     return NULL;
    }
    else {
        if((pairs=pcre_exec(f,NULL,subject,strlen(subject),0,PCRE_NOTEMPTY,vector,vecsize))<0){
         printf("Error! Number: %i\n",pairs);
        }
      else {
             
            f_ext=pcre_study(f,0,&errstr);
            j=0;
            z=0;
            
            res = new int(4);
          while((pairs=pcre_exec(f,f_ext,subject,strlen(subject),j,PCRE_NOTEMPTY,vector,vecsize))>=0){
                pcre_get_substring(subject,vector,pairs,0,&buff2);
                
                int s=0;
                int p=1;
                for (int k=strlen(buff2)-5; k>=3; k--){
                    s+=((int)buff2[k]-0x30)*p;
                    p*=10;
                }  
                
                res[z]=s;
//                printf("[%i] - %i\r\n",z, res[z]);
                
                z++;
                pcre_free_substring(buff2);
                j=vector[1]+1;
             }
          return res;   
          }     
            
      }
}    


но это решение лишь для конкретного случая.. мб кто-то знает как эта проблема должна правильно решатся, для получения сразу норм результат от регулярок..
PM MAIL WWW   Вверх
Rififi
Дата 25.7.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 36



<b>([0-9]+)<\\/b>
ищи совпавший паттерн в первой регэксповой группе. pcre не юзал, так что как там оно делается не в курсе.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1315 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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