Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/104: Рейтинг темы: голосов - 104, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
1

Парсинг

25.08.2011, 11:46. Показов 21339. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем )

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

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 и /

спасибо !
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2011, 11:46
Ответы с готовыми решениями:

Парсинг
Хочу написать программу на С++ которая будет парсить сайт и к примеру в зависимости от текста на...

Парсинг
Всем доброго времени суток. Только начал изучать c++ и нужна помощь. Есть код, нужно сделать...

Парсинг
Привет всем вообщем нужно удачно спарсить данные (gold, money, fuel, lvl, model) вид ответа хоть и...

Парсинг строки
Добрый день,подскажите, почему и как исправить у меня commands.c_str() - пустое ? Вот код: ...

18
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
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 и /

спасибо !
Чтобы не было у тебя в дальнейшем проблем с подобными задачами, почитай про конечные автоматы.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 11:52 3
У тебя не корректно условие для парсинга задано.
0
935 / 760 / 299
Регистрация: 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;
}
1
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 14:01  [ТС] 5
xAtom, хм как то я в нем разобраться не могу прокомментируй код пожалуйста... блин и еще можно код не под консоль
0
ValeryLaptev
25.08.2011, 14:27
  #6

Не по теме:

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

0
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 14:31  [ТС] 7
ValeryLaptev, дык я и хочу разобраться !
0
98 / 98 / 29
Регистрация: 26.12.2010
Сообщений: 220
25.08.2011, 14:47 8
Используй регулярки (Regular Expressions).
0
Заблокирован
25.08.2011, 17:01 9
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
xAtomблин и еще можно код не под консоль
а под что тебе нужен код? С окошками для виндоУЗ?
0
Эксперт С++
342 / 306 / 36
Регистрация: 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;  
}
1
Заблокирован
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 и /
спасибо !
0
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
25.08.2011, 19:14  [ТС] 12
alkagolik, не предирайся ) ладно из строки
0
Заблокирован
25.08.2011, 19:34 13
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
alkagolik, не предирайся ) ладно из строки
дык я не придираюсь, просто это меняет алгоритм программы. Одно дело один поиск в строке. другое дело множество поисков в строке.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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;
}
0
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;....
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.04.2012, 03:43 16
Наверное
boost::regex xRegEx("u([0-9]{1, 20})");
//...
std::cout << xResults[1] << ";";
//....
0
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
17.03.2017, 23:57 17
Avazart, тогда уж так:
Код
[^u]\d{5, 10}
т.к u тоже должен исключаться
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
18.03.2017, 10:36 18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    const string s {
        "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>"
    };
    regex e("u(\\d{1,9})");
    for(auto beg=sregex_iterator(s.cbegin(),s.cend(),e);beg!=sregex_iterator();++beg){
        cout<<beg->str(1)<<endl;
    }
    return 0;
}
Добавлено через 7 минут

Не по теме:


Кажется, автору уже не пригодится :)

1
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
18.03.2017, 12:48 19
Простенький велосипед без навороченных библиотек. Отработает только на вышеприведенных входных данных.
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
#include <fstream>
#include <string>
#include <cassert>
 
 
int main()
{
    std::ifstream input_file("in.txt");
    assert(input_file.is_open());
    std::ofstream output_file("out.txt");
    assert(output_file.is_open());
    std::string data;
 
    while (std::getline(input_file, data))
    {
        std::string::const_iterator current_symbol = begin(data);
        std::string::const_iterator preceding_symbol = begin(data);
        while(current_symbol < end(data))
        {
            if (*preceding_symbol == 'u' && isdigit(*current_symbol))
            {
                while (*current_symbol != '/')
                {
                    output_file << *current_symbol++;
                }
                output_file << std::endl;
            }
            preceding_symbol = current_symbol;
            current_symbol++;
        }
    }
 
}
0
18.03.2017, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2017, 12:48
Помогаю со студенческими работами здесь

Парсинг IPv4
Написал функцию для парсинга IPv4. И не соображу как надо переделать условия, что бы if (_it ==...

Парсинг .xls
Не уверен, туда ли я пишу, но т.к. собираюсь реализовывать на C++ - думаю раздел в какой-то мере...

Парсинг xml
При написание парсера возникла проблема, как интерпретировать следующий xml &lt;?xml version=&quot;1.0&quot;...

Парсинг html
Здравствуйте, уважаемые форумчане! Я мало знаю на тему парсинга и вот мне нужно вытащить информацию...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru