2008-10-08 14 views
100

Ich arbeite an einem kommerziellen (nicht Open Source) C++ - Projekt, das auf einem Linux-basierten System läuft. Ich muss einige Regex innerhalb des C++ Codes machen. (Ich weiß: Ich habe jetzt 2 Probleme.)C++: Welche Regex-Bibliothek sollte ich verwenden?

FRAGE: Welche Bibliotheken tun Leute, die regelmäßig regex von C/C++ empfehlen, die ich untersuche? Eine schnelle Suche hat folgendes aufmerksam gemacht:

1) Boost.Regex (Ich brauche die Boost-Software-Lizenz gehen zu lesen, aber diese Frage ist nicht über Software-Lizenzen)

2) C (nicht C++) POSIX regex (# include <regex.h>, regcomp, regexec etc.)

3) http://freshmeat.net/projects/cpp_regex/ (ich weiß nichts über diese, scheint GPL zu sein, also an diesem Projekt nicht verwendbar)

+17

Falls jemand diese alte Frage nach Hinweisen sucht ... eine neue Bibliothek ist vor kurzem aufgetaucht, die verdient, erwähnt zu werden: Googles RE2: http: // code. google.com/p/re2/ –

+16

Diese Frage hat fast 80.000 Ansichten, 32 Sterne und 229 upvotes über alle Antworten bekommen, seit ich das erste Mal vor vielen Jahren gefragt habe. Wer es als "Off-Topic" bezeichnet, ist offensichtlich kein Entwickler. Ich hasse es, wenn Menschen blind der "Bürokratie" folgen, ohne sich darum zu bemühen, vergangene willkürliche Regeln zu verstehen oder sich zu bemühen. –

+2

[This] (https://github.com/jpcre2/jpcre2) ist ein C++ - Wrapper für die neue PCRE2-Bibliothek (überarbeitete Version der PCRE). – Jahid

Antwort

21

Danke für alle Vorschläge.

Ich habe heute ein paar Dinge ausprobiert, und mit den Sachen, die wir versuchen zu tun, entschied ich mich für die einfachste Lösung, wo ich keine andere 3rd-Party-Bibliothek herunterladen muss. Am Ende habe ich # <regex.h> # und verwendet die Standard-C-POSIX-Aufrufe regcomp() und regexec(). Nicht C++, aber zur Not erwies sich das als das einfachste.

18

In C++ Projekten habe ich PCRE mit gutem Erfolg verwendet. Es ist sehr komplett 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 beigetragen hat.

15

C++ hat eine eingebaute Regex-Bibliothek seit TR1. Die Regex-Bibliothek von AFAIK Boost ist sehr gut damit kompatibel und kann als Ersatz verwendet werden, wenn Ihre Standardbibliothek TR1 nicht bereitstellt.

+0

Welcher Compiler hat TR1? Meine Kopie von g ++ 4.1.2 (Debian Etch) hat keine Unterstützung für #include , aber danke, dass ich TR1 zur Kenntnis gebracht habe, hatte ich vergessen. Für andere, die mehr über TR1 und C++ 0x wissen möchten, siehe http://en.wikipedia.org/wiki/Technical_Report_1 –

+0

Ab SP1 enthält Visual Studio 2008 die meisten von TR1, einschließlich Regex. Ich weiß, dass es dir unter Linux nicht hilft, aber andere könnten daran interessiert sein. Dinkumware unterstützt auch TR1 auf gcc. –

+0

Wie ich schrieb, wenn Ihre Std-Bibliothek keine Regex hat, dann können Sie Boost verwenden: http://www.boost.org/doc/libs/1_36_0/doc/html/boost_tr1/subject_list.html#boost_tr1poset_list .regex – Kasprzol

9

Boost hat regex drin.

, dass die Rechnung

+0

Scheint auch langsamer zu sein als Googles Re2 http://lh3lh3.users.sourceforge.net/reb.shtml – Chad

5

Ich habe persönlich immer verwendet Boost.Regex füllen sollte (obwohl ich viel brauchen nicht für regex in C++ haben). 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 vollständige Perl 5-Syntax. Ich habe es nicht benutzt, aber Sie möchten es vielleicht ausprobieren.

+8

GRETA (http://research.microsoft.com/de-us/downloads/bd99f343-4ff4-4041-8293-34c054efe749/default.aspx) wurde von Eric Niebler gemacht, als er bei Microsoft arbeitete (1998-2001 von GRETA's Header-Dateien). 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. –

+1

Entschuldigung, ich sehe nicht, wie das Einziehen der Boost-Bibliothek eine gute Sache ist. Das letzte Mal, als ich die lokale Download unkomprimierte Version von Boost überprüft habe, ist 400 MB. Ganz zu schweigen von der Inema Template-Wahnsinn, die du mit Boost bekommst. Tut mir leid, ich empfehle Gregs Antwort. – Chad

+0

http://lh3lh3.users.sourceforge.net/reb.shtml – Chad

76

Boost.Regex ist sehr gut und wird voraussichtlich Teil des C++ 0x-Standards (es ist bereits in TR1).

Persönlich finde ich Boost.Xpressive viel netter zu arbeiten. Es ist eine Header-Only-Bibliothek und es hat einige nette Funktionen wie statische Regexes (Regexes kompiliert zur Kompilierzeit).

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

+1

Ein Projekt, an dem ich persönlich beteiligt war, musste aufgrund von Problemen mit der Binärkompatibilität von Boost.Regex auf PCRE umschalten (Boosts Bibliotheken ohne Header sind meist mit unerklärlichen ABI-Brüchen und kleineren Änderungen und/oder Änderungen der Compileroptionen behaftet). Wenn es jedoch in die C++ - Standardbibliothek aufgenommen wurde, sollte das kein Problem mehr darstellen. – zwol

+4

Boost ist voller Bugs und scheint keine Codierungsstandards und keinen QA-Prozess zu haben. Es ist nicht wirklich geeignet für Produktionssoftware. Das schließt seine Regex-Ausrüstung ein, die C (und nicht C++) an einigen Stellen verwendet und Pufferüberläufe aufgrund unsicherer Funktionen wie sprintf enthält. Als ich nach einer Prüfung eine Reihe von Fehlern meldete, blieben sie Monate nach dem Bericht "unbestätigt". Benutzung auf eigene Gefahr. – jww

+1

'std :: regex' ist in' libstdC++ 'noch nicht verfügbar, also falle ich zurück auf posix regex. –

6

Sie können auch bei fast regex library schauen mit bis die bei Yandex Suchmaschinen zu tun schnelle Spiele von Tausenden von Mustern gegen riesige Datenmengen entwickelt wurde.

1

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

+1

Wenn Sie die am höchsten gewählte Antwort (von 2+ Jahren), erwähnt es dies. –

10

Zwei weitere Optionen:

Wenn Sie es in schreiben kann, C++ 11 - das Tutorial Sie: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Hinweis: Zum Zeitpunkt der einzige C++ 11 regex Bibliothek schreiben dass ich weiß funktioniert ist die clang/llvm one, und funktioniert nur auf Mac. Die GNU immer noch doesn't implement regex yet. Ich weiß nichts über Visual Studio. Die meisten Leute benutzen immer noch die boost regex Implementierung.


Oder können Sie ragel verwenden, um eine Finite-State-Maschine zu erzeugen, für Sie die Analyse zu tun, und erzeugen die C/C++ Code-Implementierung: http://www.complang.org/ragel/

habe ich es ein wenig Code zu erzeugen, parse json. Diese ragel Datei: https://github.com/matiu2/yajp/blob/master/parser/number.rl verwendet diesen Code https://github.com/matiu2/yajp/blob/master/parser/json.hpp#L254 und diesen endlichen Zustandsdiagramm zu erzeugen:

state diagram


Update 1:

LVM libC++ Regex arbeitet auf Ubuntu 14.04 : libC++ - dev - LLVM C++ Standardbibliothek (Entwicklungsdateien). Beim Kompilieren: clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Update 2:

ich zur Zeit genießen boost spirit 3 - Ich mag es mehr als regex, weil es BNF Stilregeln hat und gut durchdacht. (Ältere (mehr dokumentiert) Spirit Qi libs found here)

Verwandte Themen