Je travaille sur un projet C ++ commercial (non open source) qui fonctionne sur un système basé sur Linux. J'ai besoin de faire des expressions régulières dans le code C ++. (Je sais: j'ai maintenant 2 problèmes.)
QUESTION: Quelles bibliothèques les personnes qui utilisent régulièrement des expressions régulières à partir de C / C ++ recommandent-elles que je me penche? Une recherche rapide a attiré mon attention sur les éléments suivants:
1) Boost.Regex (je dois aller lire la licence logicielle Boost, mais cette question ne concerne pas les licences logicielles)
2) Regex POSIX C (pas C ++) (#include <regex.h>, regcomp, regexec, etc.)
3) http://freshmeat.net/projects/cpp_regex/ (je ne sais rien de celui-ci; semble être GPL, donc non utilisable sur ce projet)
Réponses:
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 à utiliser . C'est une bibliothèque avec en-tête seulement et elle a quelques fonctionnalités intéressantes telles que les expressions régulières statiques (les expressions régulières 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 à moins que vous n'ayez de bonnes raisons d'utiliser autre chose.
la source
Merci pour toutes les suggestions.
J'ai essayé quelques choses aujourd'hui, et avec ce que nous essayons de faire, j'ai opté pour la solution la plus simple où je n'ai pas à télécharger une autre bibliothèque tierce. En fin de compte, j'ai #include <regex.h> et j'ai utilisé les appels C POSIX standard regcomp () et regexec (). Pas C ++, mais à la rigueur, cela s'est avéré être le plus simple.
la source
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 fourni un ensemble de wrappers C ++ pour PCRE.
la source
C ++ a une bibliothèque regex intégrée depuis TR1. La librairie regex d'AFAIK Boost est très compatible avec elle et peut être utilisée en remplacement, si votre librairie standard ne fournit pas TR1.
la source
Deux autres options:
Si vous pouvez l'écrire en c ++ 11 - Faites le tutoriel: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339
Remarque: Au moment de la rédaction de cet article, la seule bibliothèque de regex c ++ 11 dont je sais qu'elle fonctionne est celle de clang / llvm , et ne fonctionne que sur Mac. Le GNU n'implémente toujours pas de regex . Je ne connais pas Visual Studio. La plupart des gens utilisent toujours l' implémentation de regex boost .
Ou vous pouvez utiliser ragel pour générer une machine à états finis pour faire l'analyse pour vous, et générer l'implémentation du code C / C ++: http://www.complang.org/ragel/
Je l'ai un peu utilisé 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:
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:
J'apprécie actuellement Boost Spirit 3 - je l'aime plus que l'expression régulière, car elle a des règles de style BNF et est bien pensée. (Les bibliothèques Spirit Qi plus anciennes (plus documentées) trouvées ici )
la source
Boost contient des regex .
Cela devrait remplir la facture
la source
Vous pouvez également consulter la bibliothèque de regex rapide développée sur le moteur de recherche Yandex pour faire des correspondances rapides de milliers de modèles avec d'énormes quantités de données.
la source
J'ai personnellement toujours utilisé boost.regex (bien que je n'ai pas beaucoup besoin de regex en C ++). Microsoft Labs a également une bibliothèque de regex, appelée GRETA: http://research.microsoft.com/projects/greta/ . Apparemment, il est très rapide et comporte toute une syntaxe Perl 5. Je ne l'ai pas utilisé, mais vous voudrez peut-être le tester.
la source
J'ai fait face à une situation similaire et j'ai fini par utiliser Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
la source
Personne ici n'a rien dit à propos de celui fourni avec C ++ 0x. Si vous utilisez un compilateur et la STL qui prend en charge C ++ 0x, vous pouvez simplement l'utiliser au lieu d'avoir une autre bibliothèque dans votre projet.
la source