Ich arbeite an einem kommerziellen (nicht Open Source) C ++ - Projekt, das auf einem Linux-basierten System ausgeführt wird. Ich muss einen regulären Ausdruck im C ++ - Code machen. (Ich weiß: Ich habe jetzt 2 Probleme.)
FRAGE: Welche Bibliotheken empfehlen mir Leute, die regelmäßig Regex von C / C ++ machen? Eine schnelle Suche hat mich auf Folgendes aufmerksam gemacht:
1) Boost.Regex (Ich muss die Boost-Softwarelizenz lesen, aber bei dieser Frage geht es nicht um Softwarelizenzen.)
2) C (nicht C ++) POSIX-Regex (#include <regex.h>, regcomp, regexec usw.)
3) http://freshmeat.net/projects/cpp_regex/ (Ich weiß nichts über dieses; scheint GPL zu sein, daher nicht für dieses Projekt verwendbar)
Antworten:
Boost.Regex ist sehr gut und soll Teil des C ++ 0x-Standards werden (es ist bereits in TR1 enthalten).
Persönlich finde ich es viel schöner, mit Boost.Xpressive zu arbeiten. Es ist eine reine Header-Bibliothek und verfügt über einige nette Funktionen wie statische reguläre Ausdrücke (reguläre Ausdrücke, die zur Kompilierungszeit kompiliert wurden).
Update: Wenn Sie einen C ++ 11-kompatiblen Compiler verwenden (gcc 4.8 ist NICHT!), Verwenden Sie std :: regex, es sei denn, Sie haben gute Gründe, etwas anderes zu verwenden.
quelle
Vielen Dank für alle Vorschläge.
Ich habe heute ein paar Dinge ausprobiert und mich für die einfachste Lösung entschieden, bei der ich keine andere Bibliothek von Drittanbietern herunterladen muss. Am Ende habe ich <regex.h> # eingeschlossen und die Standard-C POSIX-Aufrufe regcomp () und regexec () verwendet. Nicht C ++, aber zur Not erwies sich dies als das einfachste.
quelle
In früheren C ++ - Projekten habe ich PCRE mit gutem Erfolg verwendet. Es ist sehr vollständig und gut getestet, da es in vielen hochkarätigen Projekten verwendet wird. Und ich sehe, dass Google kürzlich auch eine Reihe von C ++ - Wrappern für PCRE beigesteuert hat.
quelle
C ++ verfügt seit TR1 über eine integrierte Regex-Bibliothek. Die Regex-Bibliothek von AFAIK Boost ist sehr kompatibel und kann als Ersatz verwendet werden, wenn Ihre Standardbibliothek kein TR1 bietet.
quelle
Zwei weitere Optionen:
Wenn Sie es in c ++ 11 schreiben können - Führen Sie das Tutorial aus: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339
Hinweis: Zum Zeitpunkt des Schreibens ist die einzige C ++ 11-Regex-Bibliothek, von der ich weiß, dass sie funktioniert, die clang / llvm- Bibliothek und funktioniert nur auf dem Mac. Die GNU implementiert noch keinen regulären Ausdruck . Ich weiß nichts über Visual Studio. Die meisten Leute verwenden immer noch die Boost-Regex- Implementierung.
Oder Sie können Ragel verwenden , um eine Finite-State-Maschine zu generieren, die das Parsen für Sie durchführt, und die C / C ++ - Code-Implementierung generieren: http://www.complang.org/ragel/
Ich habe es ein wenig benutzt, um Code zum Parsen von json zu generieren. Diese Ragel-Datei: https://github.com/matiu2/yajp/blob/master/parser/number.rl wird verwendet, um diesen Code zu generieren. Https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 und dieses Finite-State-Machine-Diagramm:
Update 1:
Der libc ++ - Regex von lvm funktioniert unter Ubuntu 14.04: libc ++ - dev - LLVM C ++ Standardbibliothek (Entwicklungsdateien). Beim Kompilieren:
clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...
Update 2:
Ich genieße derzeit Boost Spirit 3 - ich mag es mehr als Regex, weil es BNF-Regeln hat und gut durchdacht ist. (Ältere (besser dokumentierte) Spirit Qi-Bibliotheken finden Sie hier )
quelle
Boost enthält Regex .
Das sollte die Rechnung füllen
quelle
Sie können sich auch die schnelle Regex-Bibliothek ansehen , die bei der Yandex- Suchmaschine entwickelt wurde, um schnelle Übereinstimmungen von Tausenden von Mustern mit riesigen Datenmengen durchzuführen.
quelle
Ich persönlich habe boost.regex immer verwendet (obwohl ich in C ++ nicht viel Bedarf an Regex habe). Microsoft Labs hat auch eine Regex-Bibliothek namens GRETA: http://research.microsoft.com/projects/greta/ . Anscheinend ist es sehr schnell und verfügt über eine ganze Perl 5-Syntax. Ich habe es nicht benutzt, aber vielleicht möchten Sie es ausprobieren.
quelle
Ich sah mich einer ähnlichen Situation gegenüber und verwendete schließlich die Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
quelle
Niemand hier hat etwas über die mit C ++ 0x gelieferte gesagt. Wenn Sie einen Compiler und die STL verwenden, die C ++ 0x unterstützt, können Sie diese einfach verwenden, anstatt eine andere Bibliothek in Ihrem Projekt zu haben.
quelle