我一直在寻找boost :: tokenizer,我发现文档很薄。是否有可能使它像一个像“海豚 - 猴子 - 狒狒”这样的字符串进行标记,并使每一个字都成为一个标记,以及每一个双字母都是一个标记?从示例中我只看到允许单个字符分隔符。库是否不够先进,不能用于更复杂的分隔符?
答案 0 :(得分:10)
使用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'; ;
}
答案 1 :(得分:2)
我知道主题已经很老了,但是当我搜索“按字符串提升标记符”时,它会显示在谷歌的顶部链接中
所以我将添加我的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");
并使用,就像通常的提升标记器一样
答案 2 :(得分:1)
一种选择是尝试使用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;
}
答案 3 :(得分:0)
看起来你需要自己编写TokenizerFunction来做你想做的事。