Использование boost :: tokenizer с разделителями строк - PullRequest
11 голосов
/ 10 августа 2009

Я искал boost :: tokenizer и обнаружил, что документация очень тонкая. Можно ли сделать так, чтобы он маркировал строку, такую ​​как «дельфин - обезьяна - бабуин», и делал каждое слово токеном, а также каждый двойной тире токен? Из примеров я видел только разрешенные одиночные символьные разделители. Разве библиотека недостаточно продвинута для более сложных разделителей?

Ответы [ 4 ]

10 голосов
/ 07 октября 2009

Использование iter_split позволяет использовать несколько символьных токенов. Код ниже выдаст следующее:

дельфин
пн-ключ
бабуин

#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/iter_find.hpp>

    // code starts here
    std::string s = "dolphin--mon-key--baboon";
    std::list<std::string> stringList;
    boost::iter_split(stringList, s, boost::first_finder("--"));

    BOOST_FOREACH(std::string token, stringList)
    {    
        std::cout << token << '\n';  ;
    }
2 голосов
/ 07 января 2012

Я знаю, что тема довольно старая, но она отображается в верхних ссылках в Google, когда я ищу "увеличить токенизатор по строке"

поэтому я добавлю свой вариант TokenizerFunction, на всякий случай:

class FindStrTFunc
{
public:
    FindStrTFunc() : m_str(g_dataSeparator)
    {
    }

    bool operator()(std::string::const_iterator& next,
        const std::string::const_iterator& end, std::string& tok) const
    {
        if (next == end)
        {
            return false;
        }
        const std::string::const_iterator foundToken =
            std::search(next, end, m_str.begin(), m_str.end());
        tok.assign(next, foundToken);
        next = (foundToken == end) ? end : foundToken + m_str.size();
        return true;
    }

    void reset()
    {
    }

private:
    std::string m_str;
};

после того, как мы можем создать

boost::tokenizer<FindStrTFunc> tok("some input...some other input");

и используйте, как обычный токенайзер буста

1 голос
/ 10 августа 2009

Один из вариантов - попробовать boost :: regex. Не уверен в производительности по сравнению с пользовательским токенизатором.

std::string s = "dolphin--monkey--baboon";

boost::regex re("[a-z|A-Z]+|--");
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0);
boost::sregex_token_iterator end_iter;

while(iter != end_iter)
{
    std::cout << *iter << '\n';
    ++iter;
}
0 голосов
/ 10 августа 2009

Похоже, вам нужно написать собственную TokenizerFunction , чтобы делать то, что вы хотите.

...