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
undre.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!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre regex funktioniert (beide übereinstimmen, ist das so richtig) in VS 2012rc.
In g++ 4.7.1
(-std=gnu++11)
, wenn:".*FILE_(.+)_EVENT\\.DAT.*"
,regex_match
entspricht, aberregex_search
nicht.".*?FILE_(.+?)_EVENT\\.DAT.*"
wederregex_match
nochregex_search
entspricht (O_o).Alle Varianten sollten übereinstimmen, aber manche tun es nicht (aus Gründen, wurde darauf hingewiesen, bereits durch betabandido). In g++ 4.6.3
(-std=gnu++0x)
, das Verhalten ist identisch mit g++ 4.7.1.Boost (1.50) passt alles richtig w/Muster-Sorten.
Zusammenfassung:
Bezüglich Ihrer Muster, wenn Sie bedeuten ein Punkt-Zeichen
'.'
, dann sollten Sie schreiben Sie so ("\\."
). Sie können auch reduzieren backtracking mithilfe von nicht-gierig Modifikatoren (?
):Unter der Annahme, dass C++ und Boost-Regex haben eine ähnliche Struktur und Funktionalität den Unterschied zwischen
regex_match
undregex_search
erklärt hier:Suche durch die aktuelle libstdc++ source code für
regex_search
finden Sie:Leider ist dies nicht die einzigen TODO-Element Links. GCC
<regex>
Umsetzung ist derzeit unvollständig. Ich empfehle die Verwendung von Boost-oder Clang und#ifdef
den code, bis GCC eingeholt hat.(Das hat weder behoben wurde, in der 4.8 Zweig.)
Wollte ich mit der regex-Bibliothek in C++11 und ich lief in viele Probleme (sowohl mit g++ 4.6 und 4.7). Im Grunde ist der support entweder nicht vorhanden oder es ist nur teilweise Unterstützung. Das gilt auch für die SVN-version. Hier haben Sie einen link der Beschreibung der Aktueller status für die SVN-version von libstdc++.
So, für den Augenblick, ich denke, die beste Möglichkeit ist, weiterhin mit Boost.Regex.
Alternativ, Sie können versuchen, zu verwenden libc++. Nach dieses Dokument, Unterstützung für reguläre Ausdrücke abgeschlossen ist.