C ++: ¿qué biblioteca de expresiones regulares debería usar?

Estoy trabajando en un proyecto C ++ comercial (no de código abierto) que se ejecuta en un sistema basado en Linux. Necesito hacer algunas expresiones regulares dentro del código C ++. (Lo sé: ahora tengo 2 problemas)

PREGUNTA: ¿Qué bibliotecas recomiendan las personas que regularmente hacen regex de C / C ++? Una búsqueda rápida me ha llamado la atención sobre lo siguiente:

1) Boost.Regex (necesito leer la Licencia de software de Boost, pero esta pregunta no es sobre licencias de software)

2) C (no C ++) POSIX regex (#include , regcomp, regexec, etc.)

3) http://freshmeat.net/projects/cpp_regex/ (No sé nada sobre este, parece ser GPL, por lo tanto no se puede usar en este proyecto)

Boost.Regex es muy bueno y está progtwigdo para convertirse en parte del estándar C ++ 0x (ya está en TR1).

Personalmente, creo que Boost.Xpressive es mucho mejor para trabajar. Es una biblioteca de solo encabezado y tiene algunas características agradables, como expresiones regulares estáticas (expresiones regulares comstackdas en tiempo de comstackción).

Actualización: Si está utilizando un comstackdor compatible con C ++ 11 (¡gcc 4.8 NO lo es!), Use std :: regex a menos que tenga una buena razón para usar algo más.

Gracias por todas las sugerencias.

Probé algunas cosas hoy, y con las cosas que estamos tratando de hacer, opté por la solución más simple donde no tengo que descargar ninguna otra biblioteca de terceros. Al final, I #include y usé las llamadas estándar C POSIX regcomp () y regexec (). No C ++, pero en un apuro esto resultó ser el más fácil.

En proyectos anteriores de C ++, utilicé PCRE con éxito. Es muy completo y bien probado, ya que se utiliza en muchos proyectos de alto perfil. Y veo que Google también ha contribuido con un conjunto de contenedores C ++ para PCRE recientemente.

C ++ tiene una biblioteca de expresiones regulares incorporada desde TR1. La biblioteca de expresiones regulares de AFAIK Boost es muy compatible con ella y se puede utilizar como reemplazo, si su biblioteca estándar no proporciona TR1.

Dos opciones más:

Si puedes escribirlo en c ++ 11 – Haz el tutorial: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Nota: En el momento de escribir, la única biblioteca de expresiones regulares de C ++ 11 que conozco funciona es la de clang / llvm , y solo funciona en Mac. El GNU aún no implementa expresiones regulares todavía . No sé sobre Visual Studio. La mayoría de las personas aún usan la implementación de regex boost .


O puede usar ragel para generar una máquina de estados finitos para hacer el análisis sintáctico para usted y generar la implementación del código C / C ++: http://www.complang.org/ragel/

Lo usé un poco para generar código para analizar JSON. Este archivo ragel: https://github.com/matiu2/yajp/blob/master/parser/number.rl se usa para generar este código https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 y este diagtwig de máquina de estados finitos:

diagrama de estado


Actualización 1:

lvm’s libc ++ regex funciona en ubuntu 14.04: libc ++ – dev – LLVM C ++ Biblioteca estándar (archivos de desarrollo). Al comstackr: clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Actualización 2:

Actualmente estoy disfrutando de boost spirit 3 – Me gusta más que regex, porque tiene reglas de estilo BNF y está bien pensado. (Más antiguas (más documentadas) Spirit Qi libs se encuentran aquí )

Boost tiene expresiones regulares en él.

Eso debería llenar la cuenta

También puede consultar la biblioteca rápida de expresiones regulares que se desarrolló en el motor de búsqueda de Yandex para realizar coincidencias rápidas de miles de patrones con grandes cantidades de datos.

Personalmente, siempre he usado boost.regex (aunque no tengo mucha necesidad de expresiones regulares en C ++). Microsoft Labs también tiene una biblioteca de expresiones regulares llamada GRETA: http://research.microsoft.com/projects/greta/ . Aparentemente es muy rápido y presenta una syntax completa de Perl 5. No lo he usado, pero es posible que desee probarlo.

Enfrenté una situación similar y terminé usando Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx

Nadie dijo nada sobre el que viene con C ++ 0x. Si está utilizando un comstackdor y el STL que admite C ++ 0x, puede usarlo en lugar de tener otra lib en su proyecto.