Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost::tokenizer


Автор: Chaos A.D. 13.4.2006, 10:20
Вот уже часа два никак не могу разобраться с boost::tokenizer. Подскажите, какой TokenizerFunction мне выбрать, и как с ним работать, если мне нужно распарсить элементарную строку вида
Цитата

"C:/projects/qt/uic_helper/Forms/MainForm.ui"; "C:/projects/qt/uic_helper/Forms/Копия (2) MainForm.ui"; "C:/projects/qt/uic_helper/Forms/Копия MainForm.ui"

на составные части (как вы видите, на отдельные файлы)? Как мне казалось, у меня не должно было возникнуть проблем с escaped_list_separator, но не работает...

Автор: comcon1 13.4.2006, 14:14
Ща дам пример. Погодь. Вот пример прямо из моей проги.
Парсит строку типа "12 42 67".
amount -массив unsigned
_inputlist - указатель на массив строк.
Код

    boost::char_separator<char> sep(" \n\t");       // Для BOOST - tokenizer
    tokenizer::iterator tok_it;
    tokenizer *tokens;
/* ......... */
    sep = boost::char_separator<char> (" \n\t");       // Для BOOST - tokenizer
    tokens = new tokenizer((*_inputlist)[1],sep);
    tok_it = tokens->begin(); 
    if (std::distance(tokens->begin(), tokens->end()) != 3) 
      throw 0;
    for (int j=0; j<3; ++j) {
      amount[j] = lexical_cast<unsigned>(*tok_it); 
      ++tok_it; 
    }
    delete tokens;

Добавлено @ 14:22
инициализируй separator символами ' " ',' ; '. Получишь имена файлов и пробелы. Вот.

Автор: chaos 14.4.2006, 07:35
Цитата(Chaos A.D. @ 13.4.2006, 10:20)
Вот уже часа два никак не могу разобраться с boost::tokenizer. Подскажите, какой TokenizerFunction мне выбрать, и как с ним работать, если мне нужно распарсить элементарную строку вида
Цитата

"C:/projects/qt/uic_helper/Forms/MainForm.ui"; "C:/projects/qt/uic_helper/Forms/Копия (2) MainForm.ui"; "C:/projects/qt/uic_helper/Forms/Копия MainForm.ui"

на составные части (как вы видите, на отдельные файлы)? Как мне казалось, у меня не должно было возникнуть проблем с escaped_list_separator, но не работает...

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

Автор: chaos 14.4.2006, 07:58
вот тебе еще один пример с использованием boost::regex
Код

#include <iostream>
#include <boost/regex.hpp>
using namespace std;

int main()
{
    boost::regex r("(.+):(.+)\\/(.+\\..+)", boost::regex::perl|boost::regex::icase);
    boost::match_results<std::string::const_iterator> what;

    string s;
    char *strs[] = {"C:/projects/qt/uic_helper/Forms/MainForm.ui", 
                    "C:/projects/qt/uic_helper/Forms/Копия (2) MainForm.ui",
                    "C:/projects/qt/uic_helper/Forms/Копия MainForm.ui", NULL};
    int n = 0;
    while (strs[n])
    {
        s = strs[n++];
        cout << s.c_str() << endl;
        if (boost::regex_match(s, what, r))
            for (size_t m = 1; m < what.size(); m++)
                cout << what[m] << endl;
    }

    return 0;
}

Автор: comcon1 14.4.2006, 12:52
Да.
Я вот тоже предпочитаю пользоваться REGEX-парсером, а когда лень составлять РЕГЕКСы --- юзаю СПИРИТ.
Но с ним на первый раз возни ОЧЕНЬ много. Зато он сразу конверсию переменных осуществляет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)