web-dev-qa-db-fra.com

C ++: quelle bibliothèque de regex dois-je utiliser?

Je travaille sur un projet C++ commercial (et non open source) qui s'exécute sur un système Linux. J'ai besoin de faire une regex dans le code C++. (Je sais: j'ai maintenant 2 problèmes.)

QUESTION: Dans quelles bibliothèques les personnes qui font régulièrement des regex de C/C++ me conseillent-elles? Une recherche rapide a porté à mon attention les éléments suivants:

1) Boost.Regex (je dois lire la licence du logiciel Boost, mais cette question ne concerne pas les licences de logiciel)

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

3) http://freshmeat.net/projects/cpp_regex/ (Je ne sais rien de celui-ci; semble être de la licence GPL, donc non utilisable sur ce projet)

106
Stéphane

Merci pour toutes les suggestions.

J'ai essayé quelques solutions aujourd'hui et, avec ce que nous essayons de faire, j'ai opté pour la solution la plus simple, qui ne nécessite aucun téléchargement de bibliothèque tierce. En fin de compte, j'ai #include <regex.h> et utilisé les appels standard C POSIX, regcomp () et regexec (). Pas C++, mais à la rigueur, cela s’est avéré le plus simple.

22
Stéphane

Boost.Regex est très bon et devrait faire partie du standard C++ 0x (il est déjà dans TR1).

Personnellement, je trouve Boost.Xpressive beaucoup plus agréable à travailler. Il s’agit d’une bibliothèque contenant uniquement des en-têtes et quelques fonctionnalités intéressantes, telles que les regex statiques (les regex compilées au moment de la compilation).

Mise à jour: Si vous utilisez un compilateur compatible C++ 11 (gcc 4.8 n'est pas!), Utilisez std :: regex Sauf si vous avez de bonnes raisons d'utiliser autre chose.

80
Ferruccio

Dans les projets C++ passés, j’ai utilisé PCRE avec un bon succès. Il est très complet et bien testé car il est utilisé dans de nombreux projets de haut niveau. Et je vois que Google a récemment contribué à un ensemble de wrappers C++ pour PCRE.

19
Greg Hewgill

C++ a une bibliothèque de regex intégrée depuis TR1. La bibliothèque de regex de AFAIK Boost est très compatible avec elle et peut être utilisée en remplacement, si votre bibliothèque standard ne fournit pas TR1.

16
Kasprzol

Deux autres options:

Si vous pouvez l'écrire dans c ++ 11 - Suivez le didacticiel: http://www.codeguru.com/cpp/cpp /cpp_mfc/stl/article.php/c15339

Remarque: au moment de la rédaction de ce manuel, la seule bibliothèque regex c ++ 11 que je connaisse fonctionne est la clang/llvm et ne fonctionne que sur Mac. Le GNU encore n'implémente pas encore l'expression régulière . Je ne connais pas Visual Studio. La plupart des gens utilisent encore l'implémentation boost regex .


Ou vous pouvez utiliser ragel pour générer une machine à états finis permettant d'effectuer l'analyse syntaxique pour vous et générer l'implémentation du code C/C++: http : //www.complang.org/ragel/

Je l'ai utilisé un peu pour générer du code pour analyser json. Ce fichier ragel: https://github.com/matiu2/yajp/blob/master/parser/number.rl est utilisé pour générer ce code https://github.com/ matiu2/yajp/blob/master/parser/json.hpp # L254 et ce diagramme de machine à états finis:

state diagram


Mise à jour 1:

la regex libc ++ de lvm fonctionne sur ubuntu 14.04: libc ++ - dev - bibliothèque LLVM C++ Standard (fichiers de développement). Lors de la compilation: clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Mise à jour 2:

Je suis en train de profiter de boost spirit - Je l'aime plus que les regex, car il a des règles de style BNF et est bien pensé. (Vieux (plus documenté) Spirit Qi libs trouvé ici )

11
matiu

Le boost contient regex .

Cela devrait remplir la facture

10
Robert Gould

Vous pouvez également consulter bibliothèque de regex rapide qui a été développé sur Yandex moteur de recherche permettant de faire des correspondances rapides de milliers de modèles avec d’énormes quantités de données.

7

Personnellement, j'ai toujours utilisé boost.regex (bien que je n’ai pas grand besoin de regex en C++). Microsoft Labs possède également une bibliothèque regex, appelée GRETA: http://research.Microsoft.com/projects/greta/ . Apparemment, il est très rapide et utilise toute la syntaxe Perl 5. Je ne l'ai pas utilisé, mais vous voudrez peut-être le tester.

6
Roel

J'ai fait face à une situation similaire et fini par utiliser Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx

4
MartinKahn

Personne ici n'a rien dit à propos de celui fourni avec C++ 0x. Si vous utilisez un compilateur et le STL qui prend en charge C++ 0x, vous pouvez simplement l’utiliser au lieu d’avoir une autre bibliothèque dans votre projet.

2
RedX