boost::regex reagiert anders unter Linux und Windows?



  • Ich habe folgenden Code, der unter Linux richtig matched, unter Windows aber nicht:

    std::string str("(CONNECTION=(HOST=1.1.1.1)(PORT=1234))(BLA=(SERVICE=huhu)))");
    boost::regex re(".*\\(HOST=(.*?)\\).*");
    boost::cmatch matches;
    bool found = boost::regex_match(str.c_str(), matches, re);
    cout << "HOST: '" << matches[1]) << "'" << endl;
    

    Unter Linux bekomme ich folgende Ausgabe:

    HOST: '1.1.1.1'

    Unter Windows bekomme ich:

    HOST: '1.1.1.1)(PORT=1234))(BLA=(SERVICE=huhu)))'

    Wieso funktioniert das unter Windows nicht? Ich dachte Boost sei platform-unabhängig?

    Jemand eine Idee?



  • Nachdem ich die fehlende Klammer und die zwei fehlenden std:: ersetzt habe, bekomme ich

    HOST: '1.1.1.1'
    

    Boost Version 1.39, Windows.



  • Welche fehlende Klammer?
    In der RegExp?

    Wieso ist es denn wichtig, std:: zu setzen, wenn ich doch "using namespace std;" habe? Naja ich werde mal schauen, ob das bei mir was ändert.



  • TheGrudge schrieb:

    Welche fehlende Klammer?
    In der RegExp?

    Nein, die da:

    cout << "HOST: '" << matches[1]) << "'" << endl;
    //                  ^
    

    Wieso ist es denn wichtig, std:: zu setzen, wenn ich doch "using namespace std;" habe? Naja ich werde mal schauen, ob das bei mir was ändert.

    Wo? In deinem Code vielleicht. In dem Code den du nicht gepostet hast.
    In dem fehlt vermutlich auch die Klammer nicht.
    Wer weiss was da noch alles anders ist, vielleicht ca. 100 Dinge, die dann der Grund dafür sind warum es unter Windows nicht funktioniert...

    *grummel*



  • Ich kenne mich mit boost::regex nicht aus, aber meines Erachtens ist in der RegExp doch eine Klammer zu viel, oder?

    (CONNECTION=(HOST=1.1.1.1)(PORT=1234))(BLA=(SERVICE=huhu)))

    Edit:
    Ok, ich lass es Mal stehen, aber das erklärt natürlich nicht, wieso der bei der zweiten Ausgabe den ganzen Rest nimmt. Logisch wäre ja, dass der die letzte ) nicht mit einschließt, wenn er greedy ist.



  • Eisflamme schrieb:

    Ich kenne mich mit boost::regex nicht aus, aber meines Erachtens ist in der RegExp doch eine Klammer zu viel, oder?

    (CONNECTION=(HOST=1.1.1.1)(PORT=1234))(BLA=(SERVICE=huhu)))

    Das ist ja nicht die Regex, das ist der Subject-String. 😉

    Die Regex ist (C++ Escaping entfernt)

    .*\(HOST=(.*?)\).*
    

    und die sieht für mich richtig aus.

    Und wie ich schon geschrieben habe kommt bei mir auch das richtige raus. Habs natürlich nur mit einer (noch dazu relativ alten) Boost version probiert...



  • Hmm aus irgendeinem Grund waren die Strings in UTF-16 codiert, dadurch kam es zu Fehlern beim Einlesen.

    Jetzt wo alles UTF-8 ist, funktioniert es wieder.


Anmelden zum Antworten