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)
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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:
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 )
źródło
Boost zawiera wyrażenie regularne .
To powinno wypełnić rachunek
źródło
Możesz również spojrzeć na szybką bibliotekę wyrażeń regularnych, która została opracowana w wyszukiwarce Yandex do szybkiego dopasowywania tysięcy wzorców do ogromnych ilości danych.
źródło
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ć.
źródło
Miałem podobną sytuację i ostatecznie użyłem Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
źródło
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.
źródło