C ++: Welche Regex-Bibliothek soll ich verwenden? [geschlossen]

107

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)

Stéphane
quelle
20
Für den Fall, dass jemand diese alte Frage nach Hinweisen durchsucht
Stéphane
2
Dies ist ein C ++ - Wrapper für die neue PCRE2-Bibliothek (überarbeitete Version von PCRE).
Jahid

Antworten:

80

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.

Ferruccio
quelle
4
Boost ist voller Fehler und scheint keine Codierungsstandards und keinen QS-Prozess zu haben. Es ist nicht wirklich für Produktionssoftware geeignet. Dazu gehört das Regex-Zahnrad, das stellenweise C (anstelle von C ++) verwendet und Pufferüberläufe aufgrund unsicherer Funktionen wie sprintf enthält. Als ich nach einem Audit eine Reihe von Fehlern meldete, blieben diese Monate nach dem Bericht "unbestätigt". Benutzung auf eigene Gefahr.
JWW
8
Fast 5 Jahre später habe ich heute versucht, std :: regex zu verwenden, aber es stellte sich heraus, dass es noch nicht in GCC implementiert wurde. Siehe stackoverflow.com/questions/15671536/…
Stéphane
2
Dieser gute Grund, std :: regex oder boost :: regex nicht zu verwenden, wäre, dass boost :: regex etwa zehnmal langsamer ist als re2
Arsen Zahray
3
@jww Nein, der C ++ - Standard (C ++ 03 TR, C ++ 11 und C ++ 1y) hat beschlossen, mehrere Boost-Bibliotheken in den Standard aufzunehmen . Das heißt, für alle praktischen Zwecke, Erhöhung machte den Standard. Behauptungen ohne Beweise mit Wieselwörtern wie "wahrscheinlich" und persönlichen Angriffen zu ändern, ändert nichts an der Tatsache, dass große Teile von Boost jetzt C ++ sind, und viele der Leute, die die moderne Richtung von C ++ definieren, arbeiten auch an Boost.
Alice
3
@ Alice - Die C- und C ++ - Komitees erstellen Standards. Sie enthalten keine Bibliotheken. Mir ist nicht bekannt, dass sie jemals eine Bibliothek produzieren.
JWW
22

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.

Stéphane
quelle
19

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.

Greg Hewgill
quelle
16

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.

Kasprzol
quelle
Welcher Compiler hat TR1? Meine Kopie von g ++ 4.1.2 (Debian Etch) unterstützt #include <regex> nicht, aber danke, dass Sie mich auf TR1 aufmerksam gemacht haben, hatte ich vergessen. Für andere, die mehr über TR1 und C ++ 0x erfahren möchten, siehe en.wikipedia.org/wiki/Technical_Report_1
Stéphane
Ab SP1 verfügt Visual Studio 2008 über den größten Teil von TR1, einschließlich Regex. Ich weiß, dass es Ihnen unter Linux nicht hilft, aber andere könnten interessiert sein. Dinkumware unterstützt auch TR1 auf gcc.
Michael Burr
Wie ich schrieb, wenn Ihre Standardbibliothek
keinen
3
g ++ 4.5.0. TR1 lebt in tr1 / regex. Beispiel: #include <tr1 / regex>
Ogre Psalm33
11

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:

Zustandsdiagramm


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 )

matiu
quelle
7

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.

Alexander Gololobov
quelle
6

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.

Roel
quelle
8
GRETA ( research.microsoft.com/en-us/downloads/… ) wurde von Eric Niebler erstellt, als er bei Microsoft arbeitete (1998-2001 aus den Header-Dateien von GRETA). Eric Niebler machte dann 2007 Boost.Xpressive. Leute sollten Boost.Xpressive verwenden, weil es neuer ist und eine schönere Lizenz als "Microsoft Research Endbenutzer-Lizenzvereinbarung" hat
Cristian Adam
1
Entschuldigung, ich verstehe nicht, wie gut es ist, in die Boost-Bibliothek zu ziehen. Das letzte Mal, als ich die unkomprimierte lokale Download-Version von Boost überprüft habe, sind 400 Megabyte. Ganz zu schweigen von dem Inain-Template-Wahnsinn, den man mit Boost bekommt. Entschuldigung, ich empfehle Gregs Antwort.
Tschad
@Chad Weil Boost ein bekannter und angesehener Satz von Standardbibliotheken ist, die in vielen Situationen hilfreich sind? Wenn Ihnen die Downloadgröße zu groß ist, entfernen Sie mit BCD alles, was Sie nicht benötigen. boost.regex ist ziemlich klein, wenn es auf diese Weise entfernt wird.
Alice
1

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.

RedX
quelle
1
Wenn Sie sich die Antwort mit der höchsten Bewertung (vor mehr als 2 Jahren) ansehen, wird dies erwähnt.
Mateen Ulhaq