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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
#1

Парсинг - C++

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

Привет всем )

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

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++
C++ Парсинг html
Парсинг .xls C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.08.2011, 11:52     Парсинг #3
У тебя не корректно условие для парсинга задано.
xAtom
914 / 739 / 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
96 / 96 / 10
Регистрация: 26.12.2010
Сообщений: 220
25.08.2011, 14:47     Парсинг #8
Используй регулярки (Regular Expressions).
alkagolik
Заблокирован
25.08.2011, 17:01     Парсинг #9
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
xAtomблин и еще можно код не под консоль
а под что тебе нужен код? С окошками для виндоУЗ?
nameless
Эксперт C++
314 / 296 / 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
Заблокирован
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
Заблокирован
25.08.2011, 19:34     Парсинг #13
Цитата Сообщение от aidalexeyaid Посмотреть сообщение
alkagolik, не предирайся ) ладно из строки
дык я не придираюсь, просто это меняет алгоритм программы. Одно дело один поиск в строке. другое дело множество поисков в строке.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
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;....
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,051
Записей в блоге: 17
05.04.2012, 03:43     Парсинг #16
Наверное
boost::regex xRegEx("u([0-9]{1, 20})");
//...
std::cout << xResults[1] << ";";
//....
zarko97
249 / 30 / 0
Регистрация: 11.10.2015
Сообщений: 189
17.03.2017, 23:57     Парсинг #17
Avazart, тогда уж так:
Код
[^u]\d{5, 10}
т.к u тоже должен исключаться
Peoples
1084 / 588 / 403
Регистрация: 06.02.2016
Сообщений: 1,513
Записей в блоге: 11
Завершенные тесты: 4
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 минут

Не по теме:


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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2017, 12:48     Парсинг
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Notoriously
54 / 54 / 20
Регистрация: 06.07.2016
Сообщений: 354
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++;
        }
    }
 
}
Yandex
Объявления
18.03.2017, 12:48     Парсинг
Ответ Создать тему
Опции темы

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