C ++: jakiej biblioteki regex mam użyć? [Zamknięte]

107

Pracuję nad komercyjnym (nie open source) projektem C ++, który działa na systemie opartym na Linuksie. Muszę zrobić kilka wyrażeń regularnych w kodzie C ++. (Wiem: mam teraz 2 problemy.)

PYTANIE: Jakie biblioteki polecają osobom, które regularnie używają wyrażeń regularnych z C / C ++? Szybkie wyszukiwanie zwróciło moją uwagę na:

1) Boost.Regex (muszę przeczytać licencję oprogramowania Boost, ale to pytanie nie dotyczy licencji na oprogramowanie)

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

3) http://freshmeat.net/projects/cpp_regex/ (nic o tym nie wiem; wydaje się, że to GPL, dlatego nie można go używać w tym projekcie)

Stéphane
źródło
20
Na wypadek, gdyby ktoś szukał wskazówek w tym starym pytaniu ... Niedawno pojawiła się nowa biblioteka, która zasługuje na wzmiankę: Google RE2: code.google.com/p/re2
Stéphane
2
To jest opakowanie C ++ dla nowej biblioteki PCRE2 (poprawiona wersja PCRE).
Jahid

Odpowiedzi:

80

Boost.Regex jest bardzo dobry i ma stać się częścią standardu C ++ 0x (jest już w TR1).

Osobiście uważam, że Boost.Xpressive jest o wiele przyjemniejszy do pracy. Jest to biblioteka zawierająca tylko nagłówki i ma kilka fajnych funkcji, takich jak statyczne wyrażenia regularne (wyrażenia regularne kompilowane w czasie kompilacji).

Aktualizacja: Jeśli używasz kompilatora zgodnego z C ++ 11 (gcc 4.8 NIE jest!), Użyj std :: regex, chyba że masz dobry powód, aby użyć czegoś innego.

Ferruccio
źródło
4
Boost jest pełen błędów i wydaje się, że brakuje mu standardów kodowania i procesu kontroli jakości. Nie nadaje się do oprogramowania produkcyjnego. Obejmuje to jego sprzęt Regex, który używa miejscami C (zamiast C ++) i obejmuje przepełnienia bufora z powodu niebezpiecznych funkcji, takich jak sprintf. Kiedy zgłosiłem kilka błędów po audycie, pozostały one „niepotwierdzone” miesiące po zgłoszeniu. Używaj na własne ryzyko.
jww
8
Prawie 5 lat później próbowałem dzisiaj użyć std :: regex, ale okazuje się, że nie zostało to jeszcze zaimplementowane w GCC. Zobacz stackoverflow.com/questions/15671536/…
Stéphane
2
dobrym powodem, aby nie używać std :: regex lub boost :: regex w tym przypadku, byłoby to, że boost :: regex, jest około 10 razy wolniejsze niż re2
Arsen Zahray
3
@jww Nie, standard C ++ (C ++ 03 TR, C ++ 11 i C ++ 1y) zdecydował o włączeniu kilku bibliotek boost do standardu . Oznacza to, że ze względów praktycznych Boost stał się standardem. Dokonywanie twierdzeń bez dowodów przy użyciu dziwacznych słów, takich jak „prawdopodobnie”, oraz ataki osobiste nie zmieniają faktu, że duża część boostów to teraz C ++, a wiele osób definiujących współczesny kierunek C ++ również pracuje nad przyspieszeniem.
Alice,
3
@Alice - Komitety C i C ++ tworzą standardy. Nie zawierają bibliotek. Nie wiem, czy kiedykolwiek stworzyli bibliotekę.
jww
22

Dzięki za wszystkie sugestie.

Wypróbowałem dzisiaj kilka rzeczy, a dzięki rzeczom, które próbujemy zrobić, wybrałem najprostsze rozwiązanie, w którym nie muszę pobierać żadnej innej biblioteki innej firmy. Na koniec, #include <regex.h> i użyłem standardowych wywołań C POSIX regcomp () i regexec (). Nie C ++, ale w mgnieniu oka okazało się to najłatwiejsze.

Stéphane
źródło
19

W poprzednich projektach C ++ korzystałem z PCRE z dużym sukcesem. Jest bardzo kompletny i dobrze przetestowany, ponieważ jest używany w wielu prestiżowych projektach. I widzę, że Google dostarczył ostatnio zestaw opakowań C ++ dla PCRE.

Greg Hewgill
źródło
16

C ++ ma wbudowaną bibliotekę regex od wersji TR1. Biblioteka regex AFAIK Boost jest z nią bardzo kompatybilna i może być używana jako zamiennik, jeśli twoja standardowa biblioteka nie zapewnia TR1.

Kasprzol
źródło
Jaki kompilator ma TR1? Moja kopia g ++ 4.1.2 (Debian Etch) nie obsługuje #include <regex>, ale dzięki za zwrócenie mojej uwagi na TR1, zapomniałem. Dla innych, którzy chcą dowiedzieć się więcej o TR1 i C ++ 0x, zobacz en.wikipedia.org/wiki/Technical_Report_1
Stéphane
Począwszy od dodatku SP1, Visual Studio 2008 zawiera większość TR1, w tym wyrażenia regularne. Wiem, że to nie pomaga w Linuksie, ale inni mogą być zainteresowani. Dinkumware obsługuje również TR1 na gcc.
Michael Burr
Jak pisałem, jeśli twoja biblioteka std nie ma wyrażenia regularnego, możesz użyć boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol
3
g ++ 4.5.0. TR1 żyje w tr1 / regex. np .: #include <tr1 / regex>
Ogre Psalm33
11

Jeszcze dwie opcje:

Jeśli możesz napisać to w języku c ++ 11 - zrób samouczek: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Uwaga: W chwili pisania tego tekstu jedyną biblioteką regex C ++ 11, o której wiem, że działa, jest biblioteka clang / llvm i działa tylko na komputerach Mac. GNU nadal nie implementuje jeszcze wyrażenia regularnego . Nie wiem o Visual Studio. Większość ludzi nadal używa implementacji wyrażenia regularnego boost .


Lub możesz użyć ragel do wygenerowania skończonej maszyny stanowej, która przeprowadzi parsowanie za Ciebie i wygeneruje implementację kodu C / C ++: http://www.complang.org/ragel/

Użyłem go trochę do wygenerowania kodu do parsowania JSON. Ten plik ragela: https://github.com/matiu2/yajp/blob/master/parser/number.rl służy do generowania tego kodu https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 i ten diagram automatu skończonego:

schemat stanu


Aktualizacja 1:

regex lvm libc ++ działa na Ubuntu 14.04: libc ++ - dev - LLVM C ++ Biblioteka standardowa (pliki programistyczne). Podczas kompilacji:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Aktualizacja 2:

Obecnie podoba mi się Boost Spirit 3 - podoba mi się bardziej niż regex, ponieważ ma zasady w stylu BNF i jest dobrze przemyślany. (Starsze (bardziej udokumentowane) biblioteki Spirit Qi można znaleźć tutaj )

matiu
źródło
6

Osobiście zawsze używałem boost.regex (chociaż nie potrzebuję regex w C ++). Microsoft Labs ma również bibliotekę wyrażeń regularnych o nazwie GRETA: http://research.microsoft.com/projects/greta/ . Najwyraźniej jest bardzo szybki i zawiera całą składnię Perl 5. Nie używałem tego, ale możesz chcieć to przetestować.

Roel
źródło
8
GRETA ( research.microsoft.com/en-us/downloads/… ) została stworzona przez Erica Nieblera, gdy pracował w firmie Microsoft (1998-2001 z plików nagłówkowych GRETA). Eric Niebler stworzył następnie w 2007 Boost.Xpressive. Ludzie powinni używać Boost.Xpressive, ponieważ jest nowszy i ma lepszą licencję niż „Umowa licencyjna użytkownika końcowego Microsoft Research”
Cristian Adam
1
Przepraszam, nie widzę, jak pobieranie biblioteki Boost jest dobrą rzeczą. Ostatni raz, gdy sprawdzałem lokalne pobieranie nieskompresowanej wersji boost, to 400 MB. Nie wspominając o beznadziejnym szaleństwie szablonów, które otrzymujesz dzięki doładowaniu. Przepraszam, polecam odpowiedź Gregsa.
Czad,
@Chad Bo boost to dobrze znany i ceniony zestaw standardowych bibliotek, które są pomocne w wielu sytuacjach? Jeśli rozmiar pobierania jest dla Ciebie za duży, po prostu użyj BCD, aby usunąć wszystko, czego nie potrzebujesz; Boost.regex jest dość mały po usunięciu w ten sposób.
Alice,
1

Nikt tutaj nie powiedział nic o tym, który pochodzi z C ++ 0x. Jeśli używasz kompilatora i STL obsługującego C ++ 0x, możesz po prostu użyć tego zamiast mieć inną bibliotekę w swoim projekcie.

RedX
źródło
1
Jeśli spojrzysz na odpowiedź, która została najwyżej oceniona (od 2 lat temu), to o tym wspomina.
Mateen Ulhaq