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
Antwort
Es sieht so aus, als müssten Sie Ihre eigenen TokenizerFunction schreiben, um zu tun, was Sie wollen.
Ich sehe. Ich hatte gehofft, dass es etwas Vorgemachtes geben würde, aber ich denke, dass ich zu viel gehofft hatte. – Martin
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;
}
Das ist nett. Wenn es funktioniert, bekommt es meine Stimme. :) –
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'; ;
}
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. –
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
die Implementierung ist nicht ideal (könnte Fehler haben), es ist nur ein Beispiel – Alek86
- 1. Verwendung von escaped_list_separator mit Boost-Split
- 2. String Tokenizer mit mehreren Delimitern einschließlich Delimiter ohne Boost
- 3. Verwendung von Umgebungsvariablen mit Boost-Filesystem
- 4. Verwendung von boost :: asio :: async_read mit stdin?
- 5. Verwendung von boost :: depth_first_search mit Besucher
- 6. Verwendung von Boost mit Cygwin unter Windows
- 7. Verwendung von boost :: bind mit einem Konstruktor
- 8. Wie implementiert man tokenizer.rbegin() und rend() für boost :: tokenizer?
- 9. Verwendung von Boost auf Ubuntu
- 10. Verwendung von Boost :: ref korrekt ..?
- 11. Korrekte Verwendung von Boost Lambda
- 12. Problem bei der Verwendung von boost :: bind & boost :: function
- 13. Boost jede Verwendung
- 14. Tokenizer vs Token Filter
- 15. Einfacher Tokenizer mit SWI Prolog
- 16. Verwendung von STL-Containern ohne Boost-Pointer
- 17. Runtime Fehlermeldung bei Verwendung von boost :: Welle
- 18. Einfache Verwendung von boost :: Regex Gruppen
- 19. fehlgeschlagener Versuch der Verwendung von boost :: optional
- 20. Verwendung von Boost-Bimap in C++
- 21. Verwendung for_each und boost :: bind mit einem Vektor von Zeigern
- 22. Verwendung find_if und boost :: bind mit einer Reihe von shared_pointers
- 23. Boost :: Funktion von boost :: lambda :: bind von new_ptr mit Parametern
- 24. sqlite-fts3: benutzerdefinierter Tokenizer?
- 25. Entsprechende Verwendung für boost :: shared_ptr?
- 26. boost :: serialisierung von boost :: unordered_map
- 27. stanford nlp Tokenizer
- 28. Tokenizer, Stoppwortentfernung, Stemming in Java
- 29. Postgresql Volltextsuche Tokenizer
- 30. koreanische Sprache tokenizer
Einfach nur neugierig, warum dies markiert Community Wiki erstellen? –
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