【问题标题】:Using boost::tokenizer with string delimiters使用带有字符串分隔符的 boost::tokenizer
【发布时间】:2010-11-18 03:25:50
【问题描述】:

我一直在寻找 boost::tokenizer,我发现文档非常薄。是否可以让它标记一个字符串,例如“dolphin--monkey--baboon”,并使每个单词都成为一个标记,以及每个双破折号一个标记?从示例中,我只看到允许使用单个字符分隔符。对于更复杂的分隔符,库是否不够先进?

【问题讨论】:

  • 只是好奇为什么这被标记为社区维基?
  • 我认为它可以让其他人澄清我的问题,以防它有点分散。也许我应该在下一次之前阅读它是什么。

标签: c++ string boost tokenize


【解决方案1】:

我知道这个主题已经很老了,但是当我搜索“boost tokenizer by string”时,它会显示在谷歌的顶部链接中

所以我将添加我的 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");

并像通常的 boost tokenizer 一样使用

【讨论】:

  • 实现不理想(可能有bug),只是一个例子
【解决方案2】:

使用 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';  ;
    }

【讨论】:

  • 这有创建整个字符串的副本的缺点。如果要标记的字符串很大,这是一个问题。 boost tokenizer 不这样做。
【解决方案3】:

一种选择是尝试 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;
}

【讨论】:

    【解决方案4】:

    看来您需要编写自己的 TokenizerFunction 才能做您想做的事。

    【讨论】:

    • 我明白了。我希望有一些预制的东西,但我想我希望太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多