String.Find - Frage
-
Moin moin,
es geht um folgendes Problemchen:
Ich habe eine Textdatei zeilenweise eingelesen und in einem string gespeichert. Nun möchte ich diesen string nach bestimmten Zeichen durchsuchen.
Wie man zum Beispiel in "Hallo du" das "ll" findet ist mir klar, kann man aber auch folgendes machen: Ich meinem string steht FA01 und FA76 und FA33 usw usw..
und ich möchte suchen nach FA[ZAHL]...Mir geht es also darum nach FA und "EINER ZAHL" zu suchen und nicht nach FA und "EINER BESTIMMTEN ZAHL" ...um alle ergebnisse zu bekommen.
Wenn man reguläre Ausdrücke benutzen könnte wäre das ja alles kein problem (z.B. [0-9] ect...), aber mir ist nicht bekannt dass das in C++ geht.
Kann mir wer weiter helfen mein Problem zu lösen?
Hoffe ich habe das einigermaßen verständlich formuliert, sonst gern nochmal nachfragen.
Mfg monoBob
-
Ich meine mich erinnern zu koennen, dass es in boost was mit regexp gab. Schlimmstenfalls kann dir immernoch boost::spirit helfen, wengleich es etwas unfair sein duerte, ein ganzes parser-framework auf einen armen kleinen String zu jagen

-
Mit reinem C++ geht das nicht, aber wenn vorhanden, könntest du eine eigene Bibliothek für reguläre Ausdrücke verwenden (im Zweifelsfall boost::spirit - auch wenn das hier etwas übertrieben wäre).
Ansonsten hast du noch eine Alternative - such' nach "FA" und überprüfe anschließend, ob direkt dahinter eine Zahl folgt (wenn nicht - nächstes Vorkommen suchen).
-
danke erstmal für die blitzschnelle antwort!
ich werde mir das mal anschauen.Gruß monoBob
-
Entweder Du benutzt boost::regexp für reguläre Ausdrücke
oder Du suchst nach 'FA' und wertest die nächsten 2 Zeichen als Zahl (soweit denn immer nach FA eine Zahl folgt, die 2 Ziffern lang ist)
-
boost sieht ziemlich kompliziert aus. mache das dann wohl eher so dass ich gucke ob nach FA Zahlen folgen. Funktioniert das dann überhaupt wenn ich zeilenweise einlese. Bzw. wie funktioniert das? Kann mir das grad noch nicht genau vorstellen. Also die erste Abfrage sucht nach FA und dann..?
-
Solange der Zeilenumbruch nicht zwischen dem "FA" und der dazugehörigen Zahl kommt, ist es effektiv egal, wie du die Daten einliest.
Letztlich sieht das so aus:
size_t pos = data.find("FA"); while(pos!=string::npos)//wenn das hier zuschlägt, kam kein "FA"+Zahl in der Eingabe vor { if(isdigit(data[pos+2])) { //gültige Folge gefunden ... break; } pos = data.find("FA",pos+1);//nächster Versuch }
-
ne, boost is dafür eig relativ einfach, musst boost nur erstmal kompilieren, das is vielleicht schwer für nen anfänger.
boost::regex reg("FA\\d\\d"); boost::smatch match; if(boost::regex_match("FA45", match, reg)) cout << match[1] << endl;so in etwa. Aber jetzt keine garantie für richtigkeit, hab das nur ausm gedächtnis geschrieben. Aber so im groben macht man das so mit boost
-
Wo ist dein Problem? Hast du denn eine Feste Länge für die Zahlen?
Dann pseudocode:std::string tmp("FA23;FA;FA1A;FA39"); std::vector<std::string> data; for (std::size_t i = tmp.find("FA"); i < std::string::npos; tmp.find("FA", ++i)) { std::size_t pos_digit = tmp.substr(i + 2, 2).find_first_not_of("0123456789"); if (pos_digit == std::string::npos) data.push_back(tmp.substr(i, (i += 4))); }... wäre jetzt bsw. wenn dein Suchstring "FA" (2 Zeichen) und die Zahlenfolge danach den Wertebereich 00 - 99 hat (2 Zeichen) ...
-
Maxi schrieb:
ne, boost is dafür eig relativ einfach, musst boost nur erstmal kompilieren, das is vielleicht schwer für nen anfänger.
Hm, soweit ich das der boost doku entnehmen konnte ist das meiste dort pures templategewurschtel, daher nur Header und nichts, was erst kompiliert werden muesste, von ein oder zwei Ausnahmen mal abgesehen (ich glaube regexp und spirit gehoeren nicht zu den Ausnahmen). Also einfach laden und benutzen - bleibt nur, die include-pfade richtig zu setzen.
-
ja pumuckl, im allgemeinen hast du recht, allerdings gehört regex zu den dingen die kompiliert werden müssen
ob spririt auch kompiliert werden muss weiß ich jetz nicht, aber mein linker will immer ein regex-lib haben die man nur durch kompilieren erhält.