Форум программистов, компьютерный форум CyberForum.ru

Парсинг - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 11:46     Парсинг #1
Привет всем )

Есть небольшая проблема например имеется переменная

C++
1
2
3
4
String t = '<img src="http://site.ru/u3124123/d_hwre2.jpg"/> </a> 
<img src="http://site.ru/u56714036/d_auihe2j1.jpg"/> </a>
<img src="http://site.ru/u12345621/d_8oasj2.jpg"/> </a>
<img src="http://site.ru/u122331/d_zxcsdf32.jpg"/> </a>';
из каждой строки нужно вытащить цифры между u и /

спасибо !
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2011, 11:46     Парсинг
Посмотрите здесь:

Парсинг C++
Парсинг файла C++
C++ Парсинг шрифтов
C++ Парсинг файла
Рекурсивный парсинг C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
25.08.2011, 11:52     Парсинг #2
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
Привет всем )

Есть небольшая проблема например имеется переменная

C++
1
2
3
4
String t = '<img src="http://site.ru/u3124123/d_hwre2.jpg"/> </a> 
<img src="http://site.ru/u56714036/d_auihe2j1.jpg"/> </a>
<img src="http://site.ru/u12345621/d_8oasj2.jpg"/> </a>
<img src="http://site.ru/u122331/d_zxcsdf32.jpg"/> </a>';
из каждой строки нужно вытащить цифры между u и /

спасибо !
Чтобы не было у тебя в дальнейшем проблем с подобными задачами, почитай про конечные автоматы.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 11:52     Парсинг #3
У тебя не корректно условие для парсинга задано.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
25.08.2011, 12:48     Парсинг #4
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
Есть небольшая проблема например имеется переменная
Эта не проблема, а мелочь держи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <string.h>
 
const char*  get_digit(char* dst, const char* str, const char* pfx) {
    const char* ps = strstr(str, pfx);
    if(! ps)
        return NULL;
    ps += strlen(pfx);
    while( *ps && *ps != '/')
        *dst++ = *ps++;
   *dst = '\0';
    return ps;
}
 
int  main(void) {
   char str[] = "img src=\"http://site.ru/u3124123/d_hwre2.jpg\"/></a>"\
                   "<img src=\"http://site.ru/u56714036/d_auihe2j1.jpg\"/> </a>"\
                   "<img src=\"http://site.ru/u12345621/d_8oasj2.jpg\"/> </a>"\
                   "<img src=\"http://site.ru/u122331/d_zxcsdf32.jpg\"/> </a>";
    
    const char*  ptr = str;
    char snum[16]   = { '\0' };
 
    while((ptr = get_digit(snum, ptr, ".ru/u"))) 
       puts(snum);
    
      getchar();
      return 0;
}
aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 14:01  [ТС]     Парсинг #5
xAtom, хм как то я в нем разобраться не могу прокомментируй код пожалуйста... блин и еще можно код не под консоль
ValeryLaptev
25.08.2011, 14:27
  #6

Не по теме:

aidalexeyaid, ну вы ВАЩЕ!... Спасибо надо сказать, и идти разбираться...

aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 14:31  [ТС]     Парсинг #7
ValeryLaptev, дык я и хочу разобраться !
Merlin666
 Аватар для Merlin666
96 / 96 / 10
Регистрация: 26.12.2010
Сообщений: 220
25.08.2011, 14:47     Парсинг #8
Используй регулярки (Regular Expressions).
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.08.2011, 17:01     Парсинг #9
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
xAtomблин и еще можно код не под консоль
а под что тебе нужен код? С окошками для виндоУЗ?
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
25.08.2011, 17:28     Парсинг #10
aidalexeyaid,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/regex.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
 
int main() {
   std::string str = "<img src=\"http://site.ru/u56714036/d_auihe2j1.jpg\"/> </a>"
                     "<img src=\"http://site.ru/u56714036/d_auihe2j1.jpg\"/> </a>"
                     "<img src=\"http://site.ru/u12345621/d_8oasj2.jpg\"/> </a>"
                     "<img src=\"http://site.ru/u122331/d_zxcsdf32.jpg\"/> </a>";
   boost::regex reg_exp("u[0-9]{5, 10}");
   boost::smatch results;
   std::vector <std::string> v_str;
   std::string::const_iterator start = str.begin();
   std::string::const_iterator end = str.end();
   
   try {
       while (boost::regex_search(start, end, results, reg_exp)) {
           std::string temp = results[0];
           v_str.push_back(temp.substr(1, temp.size() - 1));
           start = results[1].second;
       }
       std::for_each(
           v_str.begin(),
           v_str.end(),
           std::cout << boost::lambda::_1 << "\n"
       );
   } catch (const std::exception& exc) {
       std::cout << exc.what() << std::endl;
   }
 
   return 0;  
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.08.2011, 17:51     Парсинг #11
nameless, ага
aidalexeyaid бери тот код что выше и добавь туда вывод в файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
 
int main()
{
    const char* filename = "c:\\text.txt";
    std::ofstream ofs(filename);
    if(!ofs.is_open()){
        std::cout << "can't open filestream\n";
    }
    else{
        ....
        ofs << string << "\n";
    }
    return 0;
}
результат потом будешь хватать из файла

Добавлено через 4 минуты
и кстати где ты тут видел строки? я вижу одну строку
C++
1
2
3
4
String t = '<img src="http://site.ru/u3124123/d_hwre2.jpg"/> </a> 
<img src="http://site.ru/u56714036/d_auihe2j1.jpg"/> </a>
<img src="http://site.ru/u12345621/d_8oasj2.jpg"/> </a>
<img src="http://site.ru/u122331/d_zxcsdf32.jpg"/> </a>';
из каждой строки нужно вытащить цифры между u и /
спасибо !
aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 19:14  [ТС]     Парсинг #12
alkagolik, не предирайся ) ладно из строки
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.08.2011, 19:34     Парсинг #13
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
alkagolik, не предирайся ) ладно из строки
дык я не придираюсь, просто это меняет алгоритм программы. Одно дело один поиск в строке. другое дело множество поисков в строке.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
25.08.2011, 19:52     Парсинг #14
Мой вариант, в принципе, никому не нужен, к тому же числа ограничены только теми, что влезают в unsigned long. Но так, что бы было ещё в чём по-разбираться
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    char str[] = "<img src=\"http://site.ru/u3124123/d_hwre2.jpg\"/> </a>" \
                 "<img src=\"http://site.ru/u56714036/d_auihe2j1.jpg\"/> </a>" \
                 "<img src=\"http://site.ru/u12345621/d_8oasj2.jpg\"/> </a>" \
                 "<img src=\"http://site.ru/u122331/d_zxcsdf32.jpg\"/> </a>";
 
    char const *p = str;
    char const *start = "/u";
 
    while ( NULL != (p = strstr(p, start)) )
    {
        unsigned long val;
        char *end;
 
        p += strlen(start);
 
        val = strtoul(p, &end, 10);
 
        if (end != p && *end == '/')
            printf("%lu\n", val);
    }
 
    return 0;
}
aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
28.08.2011, 11:13  [ТС]     Парсинг #15
вообщем посмотрел поучил boost написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vcl.h>
#include <boost/regex.hpp>
#include <string.h>
#include <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main()
{
std::string xStr("http://site.ru/u56714036/d_auihe2j1.jpghttp://site.ru/u4123123/d_auihe2j1.jpghttp://site.ru/u1235436/d_auihe2j1.jpghttp://site.ru/u23456456/d_auihe2j1.jpg");
 boost::regex xRegEx("u[0-9]{1, 20}");
 boost::smatch xResults;
 std::string::const_iterator xItStart = xStr.begin();
 std::string::const_iterator xItEnd = xStr.end();
while( boost::regex_search(xItStart, xItEnd, xResults, xRegEx) )
 {
   std::cout <<  xResults[0] << ";";
   xItStart = xResults[1].second;
 }
 Sleep(10000);
 return 0;
}
а как из результата первый символ удалить тоесть там выводится u56714036;u4123123;.... а нужно что бы одни цифры 56714036;4123123;....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2012, 03:43     Парсинг
Еще ссылки по теме:

C++ Парсинг html
C++ Парсинг строки
C++ Парсинг

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
05.04.2012, 03:43     Парсинг #16
Наверное
boost::regex xRegEx("u([0-9]{1, 20})");
//...
std::cout << xResults[1] << ";";
//....
Yandex
Объявления
05.04.2012, 03:43     Парсинг
Ответ Создать тему
Опции темы

Текущее время: 19:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru