C ++: quelle bibliothèque regex dois-je utiliser? [fermé]


107

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)


20
Au cas où quelqu'un chercherait des indices sur cette vieille question ... une nouvelle bibliothèque est apparue récemment qui mérite d'être mentionnée: Google's RE2: code.google.com/p/re2
Stéphane

2
Il s'agit d'un wrapper c ++ pour la nouvelle bibliothèque PCRE2 (version révisée de PCRE).
Jahid

Réponses:


80

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.


4
Boost est plein de bugs et semble manquer de normes de codage et de processus d'assurance qualité. Ce n'est pas vraiment adapté aux logiciels de production. Cela inclut son équipement Regex, qui utilise C (plutôt que C ++) par endroits et inclut des débordements de tampon dus à des fonctions non sécurisées telles que sprintf. Lorsque j'ai signalé un tas de bogues après un audit, ils sont restés «non reconnus» des mois après le rapport. À utiliser à vos risques et périls.
jww

8
Presque 5 ans plus tard, j'ai essayé aujourd'hui d'utiliser std :: regex, mais il s'avère qu'il n'a pas encore été implémenté dans GCC. Voir stackoverflow.com/questions/15671536/…
Stéphane

2
cette bonne raison de ne pas utiliser std :: regex ou boost :: regex serait que boost :: regex, est environ 10 fois plus lent que re2
Arsen Zahray

3
@jww Non, le standard C ++ (C ++ 03 TR, C ++ 11 et C ++ 1y) a décidé d' incorporer plusieurs bibliothèques boost dans le standard . Cela signifie qu'à toutes fins pratiques, Boost a fait la norme. Faire des affirmations sans preuves en utilisant des mots farfelus comme «probablement» et en utilisant des attaques personnelles ne change rien au fait que de grandes parties de boost sont désormais C ++, et beaucoup de personnes définissant la direction moderne du C ++ travaillent également sur boost.
Alice

3
@Alice - Les comités C et C ++ créent des normes. Ils n'incorporent pas de bibliothèques. Je ne suis pas au courant qu'ils ont jamais produit une bibliothèque.
jww

22

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.


19

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.


16

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.


Quel compilateur a TR1? Ma copie de g ++ 4.1.2 (Debian Etch) ne prend pas en charge #include <regex> mais merci d'avoir porté TR1 à mon attention, j'avais oublié. Pour les autres curieux d'en savoir plus sur TR1 et C ++ 0x, voir en.wikipedia.org/wiki/Technical_Report_1
Stéphane

Depuis le SP1, Visual Studio 2008 a la plupart des TR1, y compris les regex. Je sais que cela ne vous aide pas sous Linux, mais d'autres pourraient être intéressés. Dinkumware prend également en charge TR1 sur gcc.
Michael Burr

Comme je l'ai écrit, si votre bibliothèque std n'a pas de regex, vous pouvez utiliser boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol

3
g ++ 4.5.0. TR1 vit dans tr1 / regex. Par exemple: #include <tr1 / regex>
Ogre Psalm33

11

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:

diagramme d'état


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 )




6

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.


8
GRETA ( research.microsoft.com/en-us/downloads/… ) a été réalisé par Eric Niebler lorsqu'il travaillait chez Microsoft (1998-2001 à partir des fichiers d'en-tête du GRETA). Eric Niebler a ensuite réalisé en 2007 Boost.Xpressive. Les gens devraient utiliser Boost.Xpressive car il est plus récent et a une licence plus agréable que "Contrat de licence utilisateur final Microsoft Research"
Cristian Adam

1
Désolé, je ne vois pas à quel point tirer dans la bibliothèque Boost est une bonne chose. La dernière fois que j'ai vérifié la version locale de téléchargement non compressée de boost est de 400 Mo. Sans parler de la folie des modèles inain que vous obtenez avec Boost. Désolé, je recommande la réponse de Greg.
Chad


@Chad Parce que boost est un ensemble de bibliothèques standard bien connu et bien considéré qui est utile dans de nombreuses situations? Si la taille du téléchargement est trop grande pour vous, utilisez simplement BCD pour supprimer tout ce dont vous n'avez pas besoin; boost.regex est assez petit lorsqu'il est dépouillé de cette manière.
Alice


1

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.


1
Si vous regardez la réponse la plus votée (il y a plus de 2 ans), elle le mentionne.
Mateen Ulhaq
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.