2009-08-09 44 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