Mit boost :: tokenizer mit String-Trennzeichen
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?
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“
suchenso 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;
}