Hilfe bei regulärem Ausdruck



  • So blöd das klingt, ich kriegs nicht hin mir reguläre Ausdrücke (mit boost, aber das gibt's ja auch in der C++ Standard Lib oder?) beizubringen..
    Wenn mir jemand folgendes Beispiel lösen könnte, wär ich aber wohl schon nen ganzen Schritt weiter.

    Ich hab mehrere std::string 's, wo irgendwo sowas drin vorkommt: "sxxexx"
    Das 's' und das 'e' können auch mal groß sein. x steht für eine Ziffer. Ich will einfach nur die beiden Zahlen nach diesen beiden Buchstaben haben und in zwei ints speichern. Kann doch nicht so schwer sein.



  • Hast du Probleme mit regulären Ausdrücken an sich oder mit der Benutzung in C++? Für ersteres gibt es viele Online-Seiten, auf denen du live deine regulären Ausdrücke testen kannst. Ich benutze z.B. http://rubular.com, weil ich reguläre Ausdrücke haupsächlich in Ruby benutze. Ein hier passender regulärer Ausdruck wäre s(\d{2})e(\d{2}) mit dem Parameter "case insensitive". Dann stehen die Zahlen in den beiden gematchten Gruppen.



  • Ich hab jetzt ganz konkret Probleme mit der Benutzung von Boost.Regex in C++.
    Ich hab keine Ahnung, wie ich jetzt mithilfe dieses regulären Ausdrucks (\d{2})e(\d{2}) an meine 2 Variablen aus dem string in C++ mit boost komme. Ein kleines Codeschnipsel wäre nett. Den Rest kann ich mir ableiten.



  • Ich habe heute das erste Mal Boost mit Visual Studio kompiliert und als Test das hier geschrieben, vielleicht hilft es dir:

    #include <iostream>
    #include <boost/regex.hpp>
    
    int main()
    {
    	boost::regex regex("(one|two|three)");
    	boost::cmatch matches;
    	boost::regex_search("three in a row", matches, regex);
        std::cout << "The search-string is: three in a row" << std::endl;
    	std::cout << "First match of the RegEx\"(one|two|three)\" is: " << matches[1] << std::endl;
    
        std::cin.get();
    
    	return 0;
    }
    


  • Danke euch beiden, hab mir grad was gebastelt was mir eine Unmenge an Arbeit gespart hat 😉 Die Beispiele erklärn alles.
    Man muss eben nur beachten, dass bei s(\d{2})e(\d{2}) die Backslashes doppelt gemacht werden müssen in C++ (sonst sind's unlogische Escape-Sequenzen).

    Das fertige Programm sieht dann so aus:

    #include <iostream>
    
    #include <boost/regex.hpp>
    
    int main()
    {
        std::string s = "jsajd/(!1..s05E09T?.!,,d";
        boost::regex regex("(\\d{2})e(\\d{2})", boost::regex_constants::icase); //case-insensitive 
        boost::cmatch matches;
        boost::regex_search(s.c_str(), matches, regex);
        std::cout << "s = " << matches[1] << " e = " << matches[2];
    }
    

    Ausgabe:

    s = 05 e = 09


Log in to reply