Frage

Ich habe geschaut, boost :: tokenizer, und ich habe festgestellt, dass die Dokumentation sehr dünn ist. Ist es möglich, eine Zeichenfolge wie zu machen tokenize „Delphin - Affe - Pavian“ und jedes Wort ein Zeichen machen, sowie alle doppelten Bindestrich ein Zeichen? Aus den Beispielen habe ich nur einzelne Zeichenbegrenzern ist erlaubt gesehen. Ist die Bibliothek nicht genug für kompliziertere delimiters fortgeschritten?

War es hilfreich?

Lösung

Es sieht aus wie Sie Ihre eigenen TokenizerFunction zu tun, was Sie wollen.

Andere Tipps

mit iter_split können Sie mehrere Zeichen Token verwenden. Der folgende Code erzeugen würde wie folgt vor:

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

Ich weiß, das Thema ist ziemlich alt, aber es ist in den Top-Links in Google angezeigt, wenn ich „steigern tokenizer von String“

suchen

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 können erstellen

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

und zu verwenden, wie ein übliches boost tokenizer

Eine Option ist boost :: regex zu versuchen. Nicht sicher, ob der 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top