2009-08-09 10 views
11

Ich habe nach boost :: tokenizer gesucht, und ich habe festgestellt, dass die Dokumentation sehr dünn ist. Ist es möglich, eine Zeichenfolge wie "Delphin - Affe - Pavian" zu symbolisieren und jedes Wort zu einem Token zu machen, sowie jeden Doppelstrich zu einem Token? Von den Beispielen habe ich gesehen, dass nur einzelne Zeichentrennzeichen zulässig sind. Ist die Bibliothek für komplexere Trennzeichen nicht weit genug fortgeschritten?Verwendung von Boost :: Tokenizer mit String-Trennzeichen

+1

Einfach nur neugierig, warum dies markiert Community Wiki erstellen? –

+0

Ich dachte, es würde anderen erlauben, meine Frage zu klären, falls es etwas diffus wäre. Vielleicht sollte ich bis zum nächsten Mal nachlesen, was es ist. – Martin

Antwort

0

Es sieht so aus, als müssten Sie Ihre eigenen TokenizerFunction schreiben, um zu tun, was Sie wollen.

+0

Ich sehe. Ich hatte gehofft, dass es etwas Vorgemachtes geben würde, aber ich denke, dass ich zu viel gehofft hatte. – Martin

1

Eine Möglichkeit ist boost :: regex. Nicht sicher über die Leistung im Vergleich zu einem benutzerdefinierten Tokenizer.

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

Das ist nett. Wenn es funktioniert, bekommt es meine Stimme. :) –

10

Mit Iter_Split können Sie mehrere Zeichen Tokens verwenden. Der folgende Code erzeugen würde folgendes:

Delphin
mon-key
Pavian

#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

Dies hat den Nachteil, dass eine Kopie der gesamten Zeichenfolge erstellt wird. Wenn die Zeichenkette groß ist, ist dies ein Problem. Der Boost-Tokenizer tut dies nicht. –

2

Ich weiß, das Thema ist ziemlich alt, aber es ist in den Top-Links in Google angezeigt, wenn ich Suche "steigern tokenizer von string"

so werde ich meine Variante TokenizerFunction hinzufügen, nur für den Fall:

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

nachdem wir

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

und verwenden, wie ein üblicher Schub tokenizer

+0

die Implementierung ist nicht ideal (könnte Fehler haben), es ist nur ein Beispiel – Alek86

Verwandte Themen