2009-08-09 11 views
11

Ho cercato boost :: tokenizer e ho trovato che la documentazione è molto sottile. È possibile renderlo tokenize ad una stringa come "delfino-scimmia-babbuino" e rendere ogni parola un gettone, così come ogni doppio trattino un gettone? Dagli esempi ho visto solo i delimitatori a carattere singolo consentiti. La libreria non è abbastanza avanzata per delimitatori più complicati?Utilizzo di boost :: tokenizer con delimitatori di stringhe

+1

Solo curioso il motivo per cui questo è contrassegnato wiki comunità? –

+0

Ho pensato che avrebbe permesso ad altri di chiarire la mia domanda nel caso fosse un po 'diffusa. Forse dovrei leggere su quello che è, fino alla prossima volta. – Martin

risposta

0

Sembra che sarà necessario scrivere il proprio TokenizerFunction per fare ciò che si desidera.

+0

Vedo. Speravo che ci fosse qualcosa di pre-fatto, ma immagino che speravo troppo. – Martin

1

Un'opzione è provare boost :: regex. Non sono sicuro delle prestazioni rispetto a un tokenizzatore personalizzato.

+0

Questo è bello. Se funziona, ottiene il mio voto. :) –

10

utilizzando iter_split consente di utilizzare token di caratteri multipli. Il seguente codice dovrebbe produrre il seguente:

delfino
mon-chiave
babbuino

#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

Questo ha lo svantaggio di creare una copia dell'intera stringa. Se la stringa che viene tokenizzata è grande, questo è un problema. Il tokenizzatore boost non lo fa. –

2

So che il tema è abbastanza vecchio, ma è dimostrato tra i primi link in Google quando ho cercare "BOOST tokenizer dalla stringa"

così vorrei aggiungere la mia variante di TokenizerFunction, nel caso in cui:

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

dopo possiamo creare

boost::tokenizer<FindStrTFunc> tok("some input...some other input"); 

e utilizzare, come al solito spinta tokenizzatore

+0

l'implementazione non è l'ideale (potrebbe avere bug), è solo un esempio – Alek86