2009-08-09 43 views
11

我一直在寻找boost :: tokenizer,并且我发现文档非常薄。是否有可能将它标记为“海豚 - 猴子 - 狒狒”之类的字符串,并且让每个单词都成为一个标记,以及每个双重短划线都是一个标记?从例子中我只看到了单字符分隔符被允许。图书馆不够先进,不适合更复杂的分隔符?使用boost :: tokenizer与字符串分隔符

+1

只是好奇,为什么这标志着社会维基? – 2009-08-09 20:57:20

+0

我认为这会让其他人澄清我的问题,以防有点漫不经心。也许我应该读一下它是什么,直到下一次。 – Martin 2009-08-09 21:14:34

回答

0

看起来你需要编写你自己的TokenizerFunction来做你想做的事情。

+0

我明白了。我希望能有一些预先制作的东西,但我想我太希望了。 – Martin 2009-08-09 21:01:26

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; 
} 
+0

这很好。如果它有效,它会得到我的投票。 :) – 2012-10-11 21:10:44

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

这有创建整个字符串的副本的缺点。如果被标记的字符串很大,这是一个问题。 boost标记器不会这样做。 – 2012-10-11 21:09:52

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"); 

和使用,与通常的升压标记生成器

+0

执行不理想(可能有错误),它只是一个例子 – Alek86 2012-01-09 00:23:01