C ++: quale libreria regex dovrei usare? [chiuso]


107

Sto lavorando a un progetto C ++ commerciale (non open source) che gira su un sistema basato su Linux. Ho bisogno di eseguire alcune espressioni regolari all'interno del codice C ++. (Lo so: ora ho 2 problemi.)

DOMANDA: In quali librerie le persone che eseguono regolarmente regex da C / C ++ consigliano di esaminare? Una rapida ricerca ha portato alla mia attenzione quanto segue:

1) Boost.Regex (devo andare a leggere la licenza software Boost, ma questa domanda non riguarda le licenze software)

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

3) http://freshmeat.net/projects/cpp_regex/ (Non so nulla di questo; sembra essere GPL, quindi non utilizzabile su questo progetto)


20
Nel caso qualcuno stia guardando questa vecchia domanda per suggerimenti ... è apparsa di recente una nuova libreria che merita di essere menzionata: RE2 di Google: code.google.com/p/re2
Stéphane

2
Questo è un wrapper c ++ per la nuova libreria PCRE2 (versione rivista di PCRE).
Jahid

Risposte:


80

Boost.Regex è molto buono ed è destinato a diventare parte dello standard C ++ 0x (è già in TR1).

Personalmente, trovo Boost.Xpressive molto più piacevole con cui lavorare. È una libreria di sola intestazione e ha alcune caratteristiche interessanti come le espressioni regolari statiche (espressioni regolari compilate in fase di compilazione).

Aggiornamento: se stai usando un compilatore conforme a C ++ 11 (gcc 4.8 NON lo è!), Usa std :: regex a meno che tu non abbia buone ragioni per usare qualcos'altro.


4
Boost è pieno di bug e sembra mancare di standard di codifica e processo di QA. Non è proprio adatto per software di produzione. Ciò include la sua attrezzatura Regex, che utilizza C (anziché C ++) in alcuni punti e include buffer overflow dovuti a funzioni non sicure come sprintf. Quando ho segnalato un mucchio di bug dopo un audit, sono rimasti "non riconosciuti" mesi dopo la segnalazione. Utilizzare a proprio rischio.
jww

8
Quasi 5 anni dopo, ho provato oggi a utilizzare std :: regex, ma risulta che non è stato ancora implementato in GCC. Vedi stackoverflow.com/questions/15671536/…
Stéphane

2
quel buon motivo per non usare std :: regex o boost :: regex sarebbe che boost :: regex, è circa 10 volte più lento di re2
Arsen Zahray

3
@jww No, lo standard C ++ (C ++ 03 TR, C ++ 11 e C ++ 1y) ha deciso di incorporare diverse librerie boost nello standard . Ciò significa che, per tutti gli scopi pratici, Boost ha fatto lo standard. Fare affermazioni senza prove usando parole donnole come "probabilmente" e usando attacchi personali non fa nulla per cambiare il fatto che gran parte del boost è ora C ++, e molte delle persone che definiscono la direzione moderna del C ++ stanno lavorando anche su boost.
Alice

3
@Alice - I comitati C e C ++ creano standard. Non incorporano biblioteche. Non sono a conoscenza che abbiano mai prodotto una libreria.
jww

22

Grazie per tutti i suggerimenti.

Ho provato alcune cose oggi e, con le cose che stiamo cercando di fare, ho optato per la soluzione più semplice in cui non devo scaricare nessun'altra libreria di terze parti. Alla fine, ho #include <regex.h> e ho usato le chiamate POSIX C standard regcomp () e regexec (). Non C ++, ma in un pizzico questo si è rivelato il più semplice.


19

In progetti C ++ passati, ho usato PCRE con buon successo. È molto completo e ben testato poiché viene utilizzato in molti progetti di alto profilo. E vedo che Google ha contribuito recentemente anche a un set di wrapper C ++ per PCRE.


16

C ++ ha una libreria regex incorporata da TR1. La libreria regex di AFAIK Boost è molto compatibile con essa e può essere utilizzata in sostituzione, se la tua libreria standard non fornisce TR1.


Quale compilatore ha TR1? La mia copia di g ++ 4.1.2 (Debian Etch) non supporta #include <regex> ma grazie per aver portato TR1 alla mia attenzione, me ne ero dimenticato. Per altri curiosi di saperne di più su TR1 e C ++ 0x, vedere en.wikipedia.org/wiki/Technical_Report_1
Stéphane

A partire da SP1 Visual Studio 2008 ha la maggior parte di TR1, inclusa la regex. So che non ti aiuta su Linux, ma altri potrebbero essere interessati. Dinkumware supporta anche TR1 su gcc.
Michael Burr

Come ho scritto, se la tua libreria std non ha regex, puoi usare boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol

3
g ++ 4.5.0. TR1 vive in tr1 / regex. ad esempio: #include <tr1 / regex>
Ogre Psalm33

11

Altre due opzioni:

Se puoi scriverlo in c ++ 11 - Fai il tutorial: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Nota: al momento in cui scrivo l'unica libreria regex c ++ 11 che so che funzioni è quella clang / llvm e funziona solo su Mac. La GNU ancora non implementa le espressioni regolari ancora . Non so di Visual Studio. La maggior parte delle persone usa ancora l' implementazione delle espressioni regolari boost .


Oppure puoi usare ragel per generare una macchina a stati finiti per eseguire l'analisi per te e generare l'implementazione del codice C / C ++: http://www.complang.org/ragel/

L'ho usato un po 'per generare codice per analizzare json. Questo file ragel: https://github.com/matiu2/yajp/blob/master/parser/number.rl viene utilizzato per generare questo codice https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 e questo diagramma della macchina a stati finiti:

diagramma di stato


Aggiornamento 1:

La regex libc ++ di lvm funziona su ubuntu 14.04: libc ++ - dev - libreria standard LLVM C ++ (file di sviluppo). Durante la compilazione:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Aggiornamento 2:

Al momento mi sto godendo boost spirit 3 - mi piace più delle espressioni regolari, perché ha regole di stile BNF ed è ben pensato. (Librerie Spirit Qi più vecchie (più documentate) trovate qui )




6

Personalmente ho sempre usato boost.regex (anche se non ho molto bisogno di regex in C ++). Microsoft Labs ha anche una libreria regex, chiamata GRETA: http://research.microsoft.com/projects/greta/ . Apparentemente è molto veloce e presenta un'intera sintassi Perl 5. Non l'ho usato, ma potresti volerlo testare.


8
GRETA ( research.microsoft.com/en-us/downloads/… ) è stato creato da Eric Niebler quando lavorava in Microsoft (1998-2001 dai file di intestazione di GRETA). Eric Niebler ha poi realizzato nel 2007 Boost.Xpressive. Le persone dovrebbero usare Boost.Xpressive perché è più recente e ha una licenza migliore del "Contratto di licenza con l'utente finale di Microsoft Research"
Cristian Adam,

1
Mi spiace, non vedo come sia una buona cosa inserire la libreria Boost. L'ultima volta che ho controllato il download locale della versione non compressa di boost è di 400 mega. Per non parlare dell'inutile follia del modello che ottieni con la spinta. Scusa, consiglio la risposta di Greg.
Ciad


@Chad Perché boost è un insieme ben noto e apprezzato di librerie standard che sono utili in molte situazioni? Se la dimensione del download è troppo grande per te, usa semplicemente BCD per rimuovere tutto ciò che non ti serve; boost.regex è piuttosto piccolo quando viene rimosso in questo modo.
Alice


1

Nessuno qui ha detto nulla su quello fornito con C ++ 0x. Se stai usando un compilatore e l'STL che supporta C ++ 0x potresti semplicemente usarlo invece di avere un'altra libreria nel tuo progetto.


1
Se guardi la risposta con il punteggio più alto (da oltre 2 anni fa), menziona questo.
Mateen Ulhaq
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.