Frage

Ich spiele um mit der Boost-Strings Bibliothek und haben über die großartige Einfachheit der Split-Methode nur kommen.

  string delimiters = ",";
  string str = "string, with, comma, delimited, tokens, \"and delimiters, inside a quote\"";
  // If we didn't care about delimiter characters within a quoted section we could us
  vector<string> tokens;  
  boost::split(tokens, str, boost::is_any_of(delimiters));
  // gives the wrong result: tokens = {"string", " with", " comma", " delimited", " tokens", "\"and delimiters", " inside a quote\""}

Welche schön und prägnant wäre ... aber es scheint nicht mit Anführungszeichen zu arbeiten und stattdessen habe ich so etwas wie die folgende

zu tun
string delimiters = ",";
string str = "string, with, comma, delimited, tokens, \"and delimiters, inside a quote\"";
vector<string> tokens; 
escaped_list_separator<char> separator("\\",delimiters, "\"");
typedef tokenizer<escaped_list_separator<char> > Tokeniser;
Tokeniser t(str, separator);
for (Tokeniser::iterator it = t.begin(); it != t.end(); ++it)
    tokens.push_back(*it);
// gives the correct result: tokens = {"string", " with", " comma", " delimited", " tokens", "\"and delimiters, inside a quote\""}

Meine Frage ist, kann geteilt oder ein anderer Standard-Algorithmus verwendet werden, wenn Sie Trennzeichen angegeben haben? Dank purpledog aber ich habe bereits einen nicht veraltete Weg, um das gewünschte Ergebnis zu erreichen, ich denke nur, dass es recht umständlich ist und wenn ich es nicht mit einer einfacheren elegantere Lösung ersetzen könnte, würde ich es nicht, ohne vorher im Allgemeinen verwendet Einwickeln es in noch ein anderes Verfahren.

EDIT: Aktualisierte Code Ergebnisse zu zeigen und Fragen klären.

War es hilfreich?

Lösung

Es scheint nicht, dass es eine einfache Möglichkeit, dies mit der boost :: Split-Methode zu tun. Der kürzeste Stück Code, den ich finden kann, dies zu tun ist

vector<string> tokens; 
tokenizer<escaped_list_separator<char> > t(str, escaped_list_separator<char>("\\", ",", "\""));
BOOST_FOREACH(string s, escTokeniser)
    tokens.push_back(s);  

, die nur geringfügig ausführlicher als der Original-Schnipsel ist

vector<string> tokens;  
boost::split(tokens, str, boost::is_any_of(","));

Andere Tipps

Dies wird das gleiche Ergebnis wie Jamie Cook Antwort ohne ausdrückliche Schleife erreichen.

tokenizer<escaped_list_separator<char> >tok(str);
vector<string> tokens( tok.begin(), tok.end() );

Die Standardwerte zweiten Parameter des tokenizer Konstruktor escaped_list_separator<char>("\\", ",", "\"") so ist es nicht erforderlich. Es sei denn, Sie haben unterschiedliche Anforderungen an die Kommas oder Anführungszeichen.

Ich weiß nicht, über die boost :: String-Bibliothek, aber mit dem Boost-regex_token_iterator Sie werden in der Lage Begrenzungszeichen in Bezug auf regulären Ausdruck zum Ausdruck bringen. Also ja, können Sie zitiert Trennzeichen verwenden und weitaus komplexere Dinge auch.

Beachten Sie, dass dies mit regex_split getan werden verwendet, die jetzt veraltet.

Hier ist ein Beispiel aus dem Boost-doc wurde:

#include <iostream>
#include <boost/regex.hpp>

using namespace std;

int main(int argc)
{
   string s;
   do{
      if(argc == 1)
      {
         cout << "Enter text to split (or \"quit\" to exit): ";
         getline(cin, s);
         if(s == "quit") break;
      }
      else
         s = "This is a string of tokens";

      boost::regex re("\\s+");
      boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
      boost::sregex_token_iterator j;

      unsigned count = 0;
      while(i != j)
      {
         cout << *i++ << endl;
         count++;
      }
      cout << "There were " << count << " tokens found." << endl;

   }while(argc == 1);
   return 0;
}

Wenn das Programm gestartet mit Hallo Welt als Argument der Ausgabe lautet:

hello
world
There were 2 tokens found.

Ändern boost :: regex re ( "\ s +"); in boost :: regex re ( "\", \ ""); würde zitiert Trennzeichen geteilt . das Programm mit hallo Start "" Welt als Argument auch in Folge hätte:

hello
world
There were 2 tokens found.

Aber ich vermute, dass Sie mit den Dingen beschäftigen möchten wie folgt aus: "Hallo", "Welt" , wobei in diesem Fall eine Lösung:

  1. Split mit Koma nur
  2. und entfernen Sie die "" (möglicherweise mit boost / Algorithmus / string / trim.hpp oder die Regex-Bibliothek).

EDIT: hinzugefügt Programmausgabe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top