Frage

Ich versuche im Moment etwas C ++ von Grund auf neu zu lernen.
Ich bin in Python, Perl, JavaScript vertraut, habe aber in der Vergangenheit nur kurz C ++ in einer Klassenzimmerumgebung gestoßen. Bitte entschuldigen Sie die Naivität meiner Frage.

Ich möchte eine Zeichenfolge mit einem regulären Ausdruck teilen, hatte aber nicht viel Glück, ein klares, definitives, effizientes und vollständiges Beispiel dafür zu finden, wie dies in C ++ zu tun ist.

In Perl ist diese Handlung häufig und kann daher trivial erreicht werden,

/home/me$ cat test.txt
this is  aXstringYwith, some problems
and anotherXY line with   similar issues

/home/me$ cat test.txt | perl -e'
> while(<>){
>   my @toks = split(/[\sXY,]+/);
>   print join(" ",@toks)."\n";
> }'
this is a string with some problems
and another line with similar issues

Ich würde gerne wissen, wie Sie das Äquivalent in C ++ am besten erreichen können.

BEARBEITEN:
Ich glaube, ich habe gefunden, wonach ich in der Boost -Bibliothek gesucht habe, wie unten erwähnt.

Boost Regex-Token-Iiterator (Warum funktioniert nicht unterstreicht?)

Ich glaube, ich wusste nicht, wonach ich suchen sollte.


#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;
}

War es hilfreich?

Lösung

Die Boost -Bibliotheken sind in diesem Fall normalerweise eine gute Wahl Boost.regex. Da ist sogar ein Beispiel Für die Aufteilung einer Zeichenfolge in Token, die bereits das tun, was Sie wollen. Grundsätzlich kommt es auf so etwas an:

boost::regex re("[\\sXY]+");
std::string s;

while (std::getline(std::cin, s)) {
  boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
  boost::sregex_token_iterator j;
  while (i != j) {
     std::cout << *i++ << " ";
  }
  std::cout << std::endl;
}

Andere Tipps

Wenn Sie die Verwendung von Iteratoren minimieren und Ihren Code entzünden möchten, sollte Folgendes funktionieren:

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

int main()
{
  const boost::regex re("[\\sXY,]+");

  for (std::string s; std::getline(std::cin, s); ) 
  {
    std::cout << regex_replace(s, re, " ") << std::endl;   
  }

}

Im Gegensatz zu Perl werden regelmäßige Ausdrücke nicht in C ++ "eingebaut".

Sie müssen eine externe Bibliothek verwenden, z. B. Pcre.

Regex sind Teil von TR1, die in Visual C ++ 2008 SP1 (einschließlich Express Edition) und G ++ 4.3 enthalten sind.

Header ist <regex> und Namespace std :: tr1. Funktioniert hervorragend mit STL.

Erste Schritte mit C ++ TR1 regulären Ausdrücken

Visuelle C ++ Standardbibliothek: TR1 reguläre Ausdrücke

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