it-swarm.com.de

C ++: Welche Regex-Bibliothek soll ich verwenden?

Ich arbeite an einem kommerziellen (nicht Open Source) C++ - Projekt, das auf einem Linux-basierten System ausgeführt wird. Ich muss einige reguläre Ausdrücke im C++ - Code ausführen. (Ich weiß: Ich habe jetzt 2 Probleme.)

FRAGE: Welche Bibliotheken empfehlen Personen, die regelmäßig Regex aus C/C++ verwenden, zu prüfen? 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 für dieses Projekt nicht verwendbar)

106
Stéphane

Danke für all die 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 #include <regex.h> und die Standard-C-POSIX-Aufrufe regcomp () und regexec () verwendet. Nicht C++, aber zur Not erwies sich dies als die einfachste.

22
Stéphane

Boost.Regex ist sehr gut und soll Teil des C++ 0x-Standards werden (bereits in TR1 enthalten).

Persönlich finde ich Boost.Xpressive viel schöner zu arbeiten. Es handelt sich um eine reine Header-Bibliothek mit einigen nützlichen Funktionen, z. B. statischen regulären Ausdrücken (regulären Ausdrücken, die zur Kompilierungszeit kompiliert werden).

Update: Wenn Sie einen C++ 11-kompatiblen Compiler verwenden (gcc 4.8 ist NICHT!), Verwenden Sie std :: regex es sei denn, Sie haben guten Grund, etwas anderes zu verwenden.

80
Ferruccio

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.

19
Greg Hewgill

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 TR1 nicht bietet.

16
Kasprzol

Zwei weitere Optionen:

Wenn Sie es in c ++ 11 schreiben können - Machen Sie das Tutorial: 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, clang/llvm one und funktioniert nur auf Mac. Die GNU noch implementiert Regex noch nicht . Ich weiß nicht über Visual Studio. Die meisten Leute verwenden noch die Boost-Regex -Implementierung .


Oder Sie können ragel verwenden, um eine Finite-State-Maschine zu generieren, die das Parsen für Sie übernimmt, und die Implementierung des C/C++ - Codes generieren: http : //www.complang.org/ragel/

Ich habe es ein wenig benutzt, um Code zum Parsen von Json zu generieren. Diese Nageldatei: 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:

state diagram


Update 1:

libc ++ regex von lvm funktioniert unter Ubuntu 14.04: libc ++ - dev - LLVM C++ Standard-Bibliothek (Entwicklungsdateien). Beim Kompilieren: clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Update 2:

Ich genieße gerade Boost Spirit - Ich mag es mehr als Regex, weil es BNF-Regeln hat und gut ist durchdacht. (Ältere (mehr dokumentiert) Spirit Qi libs hier gefunden )

11
matiu

Boost enthält Regex .

Das sollte die Rechnung füllen

10
Robert Gould

Sie können auch schnelle Regex-Bibliothek ansehen, die unter Yandex entwickelt wurde, um schnelle Übereinstimmungen von Tausenden von Mustern mit riesigen Datenmengen zu erzielen.

7

Ich persönlich habe immer boost.regex verwendet (obwohl ich in C++ nicht viel Regex benötige). Microsoft Labs hat auch eine reguläre 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 Sie können es ausprobieren.

6
Roel

In einer ähnlichen Situation habe ich Henry Spencers Regexp Engine verwendet http://www.codeproject.com/KB/string/spencerregexp.aspx

4
MartinKahn

Niemand hier sagte etwas über die, die mit C++ 0x kommt. Wenn Sie einen Compiler und die STL verwenden, die C++ 0x unterstützt, können Sie diese verwenden, anstatt eine andere Bibliothek in Ihrem Projekt zu haben.

2
RedX