繁体   English   中英

使用带有字符串定界符的boost :: tokenizer

[英]Using boost::tokenizer with string delimiters

我一直在寻找boost :: tokenizer,并且发现文档非常薄。 是否有可能使它标记化一个字符串,例如“海豚-猴子-狒狒”,并使每个单词成为一个标记,以及使每个双破折号成为一个标记? 从示例中,我仅看到允许使用单个字符定界符。 库是否不够先进,无法使用更复杂的定界符?

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

我知道主题很旧,但是当我搜索“按字符串提升令牌生成器”时,该主题就会显示在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");

和使用一样,像通常的增强令牌生成器

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

看来您需要编写自己的TokenizerFunction来完成所需的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM