Ich versuche, std :: regex in einem C ++ 11-Code zu verwenden, aber es scheint, dass die Unterstützung etwas fehlerhaft ist. Ein Beispiel:
#include <regex>
#include <iostream>
int main (int argc, const char * argv[]) {
std::regex r("st|mt|tr");
std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl;
std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl;
std::cerr << "st|mt|tr" << " matches tr? " << std::regex_match("tr", r) << std::endl;
}
Ausgänge:
st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0
beim Kompilieren mit gcc (MacPorts gcc47 4.7.1_2) 4.7.1, entweder mit
g++ *.cc -o test -std=c++11
g++ *.cc -o test -std=c++0x
oder
g++ *.cc -o test -std=gnu++0x
Außerdem funktioniert der Regex gut, wenn ich nur zwei alternative Muster habe, z. B. st|mt
sieht es so aus, als ob das letzte aus bestimmten Gründen nicht übereinstimmt. Der Code funktioniert gut mit dem Apple LLVM-Compiler.
Irgendwelche Ideen zur Lösung des Problems?
Aktualisieren Sie eine mögliche Lösung, indem Sie Gruppen verwenden, um mehrere Alternativen zu implementieren, z (st|mt)|tr
.
<regex>
Unterstützung von libstdc ++ ist unvollständig. Was können wir Ihnen helfen?regex
in libstdc ++ finden Sie unter gcc.gnu.org/onlinedocs/libstdc++/manual/…<regex>
in den letzten drei bis vier Jahren nichts an libstdc ++ geändert hat (wie in: es bleibt nicht implementiert).<regex>
libstdc ++ (die GCC-Standardbibliothek) nichtgcc
(das Compiler-Frontend) bereitstellt , ist es Teil von GCC (dem Projekt). Siehe "libstdc ++ - v3 wird als Teil von GCC entwickelt und veröffentlicht" . Wenn Ihre Distribution es in ein separates Paket aufteilt, hat das nichts mit GCC zu tun.Antworten:
<regex>
wurde in GCC 4.9.0 implementiert und veröffentlicht.In Ihrer (älteren) Version von GCC ist es nicht implementiert .
Dieser Prototypcode
<regex>
wurde hinzugefügt, als die gesamte C ++ 0x-Unterstützung von GCC sehr experimentell war, frühe C ++ 0x-Entwürfe verfolgte und den Menschen zum Experimentieren zur Verfügung gestellt wurde. Dies ermöglichte es den Menschen, Probleme zu finden und dem Standardkomitee Feedback zu geben, bevor der Standard fertiggestellt wurde. Zu der Zeit , viele Leute waren dankbar , hatte Zugang zu Kante haben Blutungen kennzeichnet lange vor C ++ 11 fertig war und vor vielen anderen Compilern zur Verfügung gestellt jede Unterstützung, und das Feedback wirklich geholfen zu verbessern C ++ 11. Dies war eine gute Sache TM .Der
<regex>
Code befand sich nie in einem nützlichen Zustand, sondern wurde wie viele andere Codebits zu dieser Zeit als Work-in-Progress hinzugefügt. Es wurde eingecheckt und anderen zur Zusammenarbeit zur Verfügung gestellt, wenn sie wollten, mit der Absicht, dass es irgendwann fertig sein würde.So funktioniert Open Source oft: Frühes Release, oftes Release - leider haben
<regex>
wir nur den frühen Teil richtig gemacht und nicht den oft Teil, der die Implementierung abgeschlossen hätte.Die meisten Teile der Bibliothek waren vollständiger und sind jetzt fast vollständig implementiert, waren es aber
<regex>
nicht. Daher blieb sie seit dem Hinzufügen im gleichen unfertigen Zustand.Es war vor ein paar Jahren keine so schlechte Idee, als C ++ 0x noch in Arbeit war und wir viele Teilimplementierungen ausgeliefert haben. Niemand dachte, dass es so lange unbrauchbar bleiben würde, so dass es im Nachhinein vielleicht deaktiviert sein sollte und ein Makro oder eine integrierte Option benötigt, um es zu aktivieren. Aber dieses Schiff ist schon lange gesegelt. Es gibt exportierte Symbole aus libstdc ++. Eine Bibliothek, die vom Regex-Code abhängt. Ein einfaches Entfernen (z. B. in GCC 4.8) wäre also nicht trivial gewesen.
quelle
Funktionserkennung
Dies ist ein Ausschnitt, um festzustellen, ob die
libstdc++
Implementierung mit C-Präprozessor-Definitionen implementiert ist:Makros
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
ist definiert inbits/regex.tcc
in4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
ist definiert inbits/regex_automatron.h
in5+
_GLIBCXX_RELEASE
wurde7+
als Ergebnis dieser Antwort hinzugefügt und ist die GCC-HauptversionTesten
Sie können es mit GCC folgendermaßen testen:
Ergebnisse
Hier sind einige Ergebnisse für verschiedene Compiler:
Hier sind Drachen
Dies wird nicht unterstützt und beruht auf der Erkennung privater Makros, die die GCC-Entwickler in die
bits/regex*
Header eingefügt haben. Sie konnten sich jederzeit ändern und weggehen . Hoffentlich werden sie in den aktuellen Versionen 4.9.x, 5.x, 6.x nicht entfernt, aber sie könnten in den Versionen 7.x verschwinden.Wenn die GCC-Entwickler
#define _GLIBCXX_HAVE_WORKING_REGEX 1
in der Version 7.x einen (oder etwas, Hinweis-Hinweis-Anstoß) hinzufügen , der weiterhin besteht, könnte dieses Snippet aktualisiert werden, um dies einzuschließen, und spätere GCC-Versionen würden mit dem obigen Snippet funktionieren.Soweit ich weiß, haben alle anderen Compilern eine Arbeits
<regex>
wenn__cplusplus >= 201103L
aber YMMV.Offensichtlich würde dies völlig kaputt gehen, wenn jemand die
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
oder_GLIBCXX_REGEX_STATE_LIMIT
Makros außerhalb derstdc++-v3
Header definiert.quelle
_GLIBCXX_REGEX_IS_OK_NOW_KTHXBAI
in den Headern fragen , damit es nicht vergessen wird - danke!Derzeit (unter Verwendung von std = c ++ 14 in g ++ (GCC) 4.9.2) wird regex_match noch nicht akzeptiert.
Hier ist ein Ansatz, der wie regex_match funktioniert, aber stattdessen sregex_token_iterator verwendet. Und es funktioniert mit g ++.
es wird 1 2 3 gedruckt
Sie können die Referenz zu sregex_token_iterator unter folgender Adresse lesen: http://en.cppreference.com/w/cpp/regex/regex_token_iterator
quelle
std::regex_search
, siehe wandbox.org/permlink/rLbGyYcYGNsBWsaB