Mit der std::string::find()
Funktion können Sie die Position Ihres Zeichenfolgenbegrenzers ermitteln und anschließend std::string::substr()
ein Token abrufen.
Beispiel:
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
Die find(const string& str, size_t pos = 0)
Funktion gibt die Position des ersten Auftretens str
in der Zeichenfolge zurück oder npos
wenn die Zeichenfolge nicht gefunden wird.
Die substr(size_t pos = 0, size_t n = npos)
Funktion gibt einen Teilstring des Objekts zurück, beginnend an Position pos
und Länge npos
.
Wenn Sie mehrere Trennzeichen haben, können Sie dieses nach dem Extrahieren eines Tokens entfernen (einschließlich Trennzeichen), um mit den nachfolgenden Extraktionen fortzufahren (wenn Sie die ursprüngliche Zeichenfolge beibehalten möchten, verwenden Sie einfach s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
Auf diese Weise können Sie leicht eine Schleife erstellen, um jedes Token zu erhalten.
Vollständiges Beispiel
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
Ausgabe:
scott
tiger
mushroom
size_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
mushroom
Ausgänge außerhalb der Schleife, dhs = mushroom
std::string token = s.substr(s.find(delimiter) + 1);
, wenn Sie sicher sind, dass es existiert (ich benutze +1 in der Länge) ...Diese Methode verwendet,
std::string::find
ohne die ursprüngliche Zeichenfolge zu mutieren, indem der Anfang und das Ende des vorherigen Teilstring-Tokens gespeichert werden.quelle
Mit der nächsten Funktion können Sie die Zeichenfolge teilen:
quelle
split("abc","a")
einen Vektor oder eine einzelne Zeichenfolge zurück,"bc"
wobei ich denke, dass es sinnvoller wäre, wenn es einen Vektor von Elementen zurückgegeben hätte["", "bc"]
. Bei der Verwendungstr.split()
in Python war es für mich intuitiv, eine leere Zeichenfolge zurückzugeben, fallsdelim
sie entweder am Anfang oder am Ende gefunden wurde, aber das ist nur meine Meinung. Wie auch immer, ich denke, es sollte erwähnt werdenif (!token.empty())
Ich würde dringend empfehlen, das von @kyriakosSt erwähnte Problem sowie andere Probleme im Zusammenhang mit aufeinanderfolgenden Trennzeichen zu entfernen .if (!token.empty())
scheint nicht ausreichend zu sein, um es zu beheben.Für Zeichenfolgenbegrenzer
Geteilte Zeichenfolge basierend auf einem Zeichenfolgenbegrenzer . Wenn Sie beispielsweise eine Zeichenfolge
"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
basierend auf dem Zeichenfolgenbegrenzer aufteilen"-+"
, wird die Ausgabe ausgeführt{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Ausgabe
Für Einzelzeichenbegrenzer
Geteilte Zeichenfolge basierend auf einem Zeichenbegrenzer. Wenn Sie beispielsweise einen String
"adsf+qwer+poui+fdgh"
mit einem Trennzeichen teilen ,"+"
wird dies ausgegeben{"adsf", "qwer", "poui", "fdg"h}
Ausgabe
quelle
vector<string>
Ich denke, es wird Kopierkonstruktor nennen.Dieser Code trennt Zeilen vom Text und fügt alle zu einem Vektor hinzu.
Angerufen von:
quelle
vector<string> split(char *phrase, const string delimiter="\n")
Mit strtok können Sie mehrere Zeichen als Trennzeichen übergeben. Ich wette, wenn Sie "> =" übergeben haben, wird Ihre Beispielzeichenfolge korrekt aufgeteilt (obwohl> und = als einzelne Trennzeichen gezählt werden).
BEARBEITEN Wenn Sie nicht
c_str()
zum Konvertieren von Zeichenfolge in Zeichen * verwenden möchten , können Sie substr und find_first_of zum Tokenisieren verwenden .quelle
strtok()
da ich dafür ein char-Array anstelle eines Strings verwenden müsste..c_str()
ist auch billig und einfach.Hier ist meine Meinung dazu. Es behandelt die Randfälle und verwendet einen optionalen Parameter, um leere Einträge aus den Ergebnissen zu entfernen.
Beispiele
quelle
Dies sollte perfekt für Zeichenfolgen- (oder Einzelzeichen-) Trennzeichen funktionieren. Vergessen Sie nicht einzuschließen
#include <sstream>
.Die erste while-Schleife extrahiert ein Token mit dem ersten Zeichen des Zeichenfolgenbegrenzers. Die zweite while-Schleife überspringt den Rest des Trennzeichens und stoppt am Anfang des nächsten Tokens.
quelle
Ich würde verwenden
boost::tokenizer
. In der folgenden Dokumentation wird erläutert, wie eine geeignete Tokenizer-Funktion erstellt wird: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmHier ist eine, die für Ihren Fall funktioniert.
quelle
Die Antwort ist bereits vorhanden, aber die ausgewählte Antwort verwendet die Löschfunktion, die sehr kostspielig ist. Denken Sie an eine sehr große Zeichenfolge (in MB). Deshalb benutze ich unten Funktion.
quelle
string.split()
Methode.)Dies ist eine vollständige Methode, die die Zeichenfolge in ein beliebiges Trennzeichen aufteilt und einen Vektor der zerhackten Zeichenfolgen zurückgibt.
Es ist eine Adaption der Antwort von Ryanbwork. Seine Prüfung auf:
if(token != mystring)
führt jedoch zu falschen Ergebnissen, wenn sich in Ihrer Zeichenfolge Elemente wiederholen. Dies ist meine Lösung für dieses Problem.quelle
while (true)
ist normalerweise beängstigend in einem Code wie diesem zu sehen. Persönlich würde ich empfehlen, dies neu zu schreiben, damit der Vergleich mitstd::string::npos
(bzw. eine Prüfung gegenmystring.size()
) daswhile (true)
obsolet macht .Wenn Sie die Zeichenfolge nicht ändern möchten (wie in der Antwort von Vincenzo Pii) und auch das letzte Token ausgeben möchten, können Sie diesen Ansatz verwenden:
quelle
PS: Funktioniert nur, wenn die Länge der Zeichenfolgen nach dem Teilen gleich ist
quelle
Funktion:
Unit-Tests:
quelle
quelle
quelle