Probleme mit Regex



  • Guten Tag,
    Ich habe ich ein paar Probleme mit dem Regex der C++ Standartbibliothek.Ich bin gerade dabei aus einer Zeile einen Pfad zu filtern.
    Ein Beispiel Pfad wäre z.B. dieser hier:

    O32 - AutoRun File - [2012.01.19 10:47:05 | 000,008,192 | ---- | M] (Microsoft) - E:\AutoOff.exe -- [ NTFS ]
    

    Mein Regex Pattern dazu ist:

    [A-Z]:.*?(\.[A-Za-z]{3})
    

    Dieses Pattern funtkioniert bei allen Regex Testen bisher,doch nur bei C++ nicht.
    Ausserdem habe ich noch eine Frage.Bei C++ muss man einen Backslash ja normalerweise Escapen,damit es nicht als Escape Sequenz gewertet wird.Bei einem Regex Pattern jetzt aber,muss man bei diesem Patter \. auch noch Escapen also \. ?
    Und noch den Code den ich dafür nutzte

    std::string RCL::File::GetFileName()
    	{
    	std::regex rgx(" [A-Z]:.*?(\\.[A-Za-z]{3})",std::regex_constants::ECMAScript);
    	std::cmatch match;
    	if (std::regex_match(FilePath.c_str(),match,rgx,std::regex_constants::match_default))
    		{
    		return match.str();
    		}
    
    	return "No machtes Found";
    	}
    


  • Weiß niemand ne Lösung?



  • Ja, der Rückstrich muss trotzdem maskiert werden (so, wie du es schon geschrieben hast).
    Du solltest genauer beschreiben, was du mit funktioniert nicht meinst. Es gibt viele Varianten, wie das, was du geschrieben hast, nicht funktionieren könnte. Stürzt das Programm ab? Kann es überhaupt übersetzt werden? Ich vermute aber, dass das, was erkannt und extrahiert wird, nicht mit dem übereinstimmt, was du erwartet hattest.
    Ich kenne mich mit regulären Ausdrücken leider nicht sonderlich gut aus, insbesondere nicht mit den Möglichkeiten der Standardbibliothek, trotzdem vermute ich, dass du ein Klammerpaar falsch gesetzt hast, der Ausdruck müsste eher so aussehen: < ([A-Z]:.*?\.[A-Za-z]{3}) >.
    Zumindest laut dem Regular-Expression-Testbed-Plugin in Code::Blocks ist dann Match 1 das gesuchte. (Ich habe jetzt beim drüberschauen nicht so ganz verstanden, ob das dann match[1] ist, aber das kannst du bestimmt selbst rausfinden 😉 )



  • Guten Tag Sonnentrillerei,
    Danke für die Antwort,
    Das Programm stürzt nicht ab,aber die regex_match funktion gibt false zurück.
    Zum Beispiel funktioniert .* noch aber [A-Z]:.* nicht.



  • Du suchst vielleicht std::regex_search statt std::regex_match ? std::regex_match versucht immer, den gesamten String zu matchen und sucht nicht nach matchenden Teilstrings.



  • Ah Vielen Dank.Genau das wars!


Log in to reply