Boost Split String nach Komma und Semikolon
-
Moin,
ich werd gerade bescheuert hier. Ich habe einen String mit E-Mail Adressen die durch ein Komma oder Semikolon getrennt sind. Wie ist der Ausdruck dafür?!
DANKE!!
-
secondsun schrieb:
ich werd gerade bescheuert hier. Ich habe einen String mit E-Mail Adressen die durch ein Komma oder Semikolon getrennt sind. Wie ist der Ausdruck dafür?!
Dafür gibt es doch eine relativ gutes Beispiel in der Boost-Dokumentation.
Ich tippe jetzt einfach mal auf:
std::string emailtext; std::vector<std::string> emails; boost::split(emails, emailtext, boost::is_any_of(",;"), token_compress_on);
-
Das ist ja noch besser!! Benutze Boost erst seit heute und bin noch gar nicht auf diese Idee gekommen. Funktioniert wunderbar!!
Danke:-)
-
Ohne Boost: Ersetze alle ',' oder ';' durch Leerzeichen, lade den String in einen Stringstream, nutze istream_iterator<string> . Wahrscheinlich kann man die Menge der Whitespaces auch irgendwie erweitern. Alternativ gibt es auch noch regex in C++11 .
-
knivil schrieb:
Wahrscheinlich kann man die Menge der Whitespaces auch irgendwie erweitern.
Siehe meinen Post hier:
#include <iostream> #include <sstream> class whitespace_facet : public std::ctype<char> { mask my_table[table_size]; public: whitespace_facet(const char *ws) : std::ctype<char>(my_table) { std::copy(classic_table(), classic_table() + table_size, my_table); while (*ws) my_table[static_cast<size_t>(*ws++)] |= space; } }; int main() { std::istringstream fs("a@b.c;d@e.f"); fs.imbue(std::locale(std::locale(), new whitespace_facet(";"))); for (std::string s; fs >> s;) std::cout << s << '\n'; } // Ausgabe: a@b.c d@e.f
-
Hey, musst du mir 15 Minuten zuvorkommen?

Die gleiche Idee hatte ich nämlich auch:
#include <iostream> #include <algorithm> #include <locale> #include <iterator> #include <sstream> #include <climits> int main() { std::ctype<char>::mask masks[CHAR_MAX]; // Array für die Bitmasken char allchars[CHAR_MAX]; for (int i = 0; i < CHAR_MAX; ++i) allchars[i] = i; std::locale loc; // Hole Standardlocale std::use_facet< std::ctype<char> >(loc).is(allchars, allchars + CHAR_MAX, masks); // Hole Masken der Locale masks[';'] |= std::ctype<char>::space; // ';' soll space werden masks[','] |= std::ctype<char>::space; // ',' soll space werden std::stringstream addresses("abc@example.com,def@foo.org;rgt123@bar.tv;yuio@poiu.56,mnbvcxz@qazxsw.edc"); std::locale address_locale(addresses.getloc(), new std::ctype<char>(masks)); addresses.imbue(address_locale); std::copy(std::istream_iterator<std::string>(addresses), std::istream_iterator<std::string>(), std::ostream_iterator<std::string>(std::cout, "\n")); }edit: Ach, classic_table! Da hätte ich mal dran denken sollen, das wäre wesentlich einfacher gewesen als mein umständliches Programm. Dann wäre ich auch flotter mit der Antwort gewesen. Ich nutze die facets einfach viel zu selten, da fehlt mir die Übung. Eigentlich schade, da kann man so schöne Sachen mit machen.