Unterschied zwischen regex_match und regex_search?

Ich war das Experimentieren mit regulären Ausdruck im Versuch, eine Antwort auf diese Frage, und fand, dass, während regex_match eine übereinstimmung findet, wird regex_search nicht.

Das folgende Programm wurde kompiliert mit g++ 4.7.1:

#include <regex>
#include <iostream>

int main()
{
    const std::string s = "/home/toto/FILE_mysymbol_EVENT.DAT";
    std::regex rgx(".*FILE_(.+)_EVENT\\.DAT.*");
    std::smatch match;

    if (std::regex_match(s.begin(), s.end(), rgx))
        std::cout << "regex_match: match\n";
    else
        std::cout << "regex_match: no match\n";

    if (std::regex_search(s.begin(), s.end(), match, rgx))
        std::cout << "regex_search: match\n";
    else
        std::cout << "regex_search: no match\n";
}

Ausgabe:

regex_match: match 
regex_search: keine übereinstimmung 

Ist meine Annahme, dass beide übereinstimmen sollten, falsch, oder könnte es ein problem mit der Bibliothek im GCC 4.7.1?

  • GCC-regex-Bibliothek ist noch weitgehend uninmplemented (GCC Y U SCHIFF GEBROCHEN <regex>?), also, ich bin geneigt zu sagen, dass, ja, es ist ein problem mit der Bibliothek.
  • Ihr Programm ergibt ein match zweimal mit VS2010 also ich denke das problem ist, mit der Bibliothek, der gcc verwendet. Haben Sie versucht, mit Hilfe der boost-version der regex-Bibliothek?
  • VS2010 scheint richtig zu sein hier. In Anbetracht der test-string und dem regulären Ausdruck verwendet, sollten beide übereinstimmen. Zum Beispiel, beide re.match und re.search von der Python, einer übereinstimmung zu.
  • Warum nicht einfach die POSIX - <regex.h> API statt?
  • POSIX-regex ist schlicht, einfach und gut C, aber möglicherweise nicht win32/win64 kompatibel (letztes mal versuchte ich war es nicht).
  • sicher, das ist, warum es POSIX...
  • Denn es ist nicht C++? 🙂
  • Oh warte, ich dachte, Sie könnte verwenden, C von C++...?
  • Sie können auch die Montage, aber Sie können nicht wollen, das zu tun 🙂 das Gleiche gilt für die C Funktionen in C++. Brechen Sie die C++ - Programmierung-Stil (z.B.,, die Sie benötigen, um starten Sie die überprüfung für die Rückkehr-codes, statt die Sorge um Ausnahmen).
  • Ja, natürlich, aber im moment bin ich versucht, um zu wissen, wie der neue standard C++11 und alle seine Funktionen. In einem real-world-Szenario würde ich wahrscheinlich Schub, oder was auch immer im system verfügbar ist (wie z.B. standard-POSIX-Funktionalität).
  • willst du kämpfen? Haben Sie einen Blick auf die Objective-C runtime messaging-Funktionen... 😀
  • Ich würde auf jeden Fall verwenden Sie POSIX-regex (oder "Boost".Regex), wenn ich brauchte, um zu realisieren, dass so etwas wie im echten code. Aber die OP ' s Frage ist gut. Eigentlich Frage ich mich, warum GCC beschlossen release eine kaputte Implementierung von regulären Ausdrücken. Es ist besser, überhaupt keine Unterstützung, als eine defekte ein...
  • ja, natürlich... Trotzdem Glibc ist komisch...
  • Ja, libstdc++'s <regex - > ist unimplemented. Es ist aus dem Grund ausgeliefert ist, dass jemand trug eine partielle, experimentelle Umsetzung, wie üblich bei open-source-Projekte, wie dann auch manchmal passieren, in open-source-Projekte, die Sie verschwunden, verlassen, es ist unvollendet. Da einige Symbole werden exportiert libstdc++.so es kann nicht wieder entfernt werden, ohne ändern der ABI. Wenn Sie es nicht mögen dann könnte Ihnen helfen, es umzusetzen, zu bezahlen jemand um es zu implementieren, oder stoppen Sie beschweren sich über code, den Sie umsonst bekommen, Dank anderer Leute harte Arbeit!

Schreibe einen Kommentar