Estoy trabajando en un proyecto comercial de C ++ (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 expresiones regulares 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 <regex.h>, regcomp, regexec, etc.)
3) http://freshmeat.net/projects/cpp_regex/ (no sé nada sobre este; parece ser GPL, por lo tanto, no se puede utilizar en este proyecto)
Respuestas:
Boost.Regex es muy bueno y está programado para convertirse en parte del estándar C ++ 0x (ya está en TR1).
Personalmente, encuentro Boost.Xpressive mucho más agradable para trabajar. Es una biblioteca de solo encabezado y tiene algunas características interesantes, como expresiones regulares estáticas (expresiones regulares compiladas en tiempo de compilación).
Actualización: si está usando un compilador compatible con C ++ 11 (¡gcc 4.8 NO lo es!), Use std :: regex a menos que tenga una buena razón para usar otra cosa.
fuente
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, #incluí <regex.h> y usé las llamadas estándar C POSIX regcomp () y regexec (). No C ++, pero en caso de apuro, resultó ser el más fácil.
fuente
En proyectos de C ++ anteriores, he usado PCRE con éxito. Es muy completo y probado, ya que se utiliza en muchos proyectos de alto perfil. Y veo que Google también ha contribuido recientemente con un conjunto de envoltorios de C ++ para PCRE.
fuente
C ++ tiene una biblioteca regex incorporada desde TR1. La biblioteca de expresiones regulares de AFAIK Boost es muy compatible con él y se puede usar como reemplazo, si su biblioteca estándar no proporciona TR1.
fuente
Dos opciones más:
Si puede escribirlo en c ++ 11 , siga el tutorial: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339
Nota: en el momento de escribir este artículo, la única biblioteca de expresiones regulares de c ++ 11 que sé que funciona es clang / llvm , y solo funciona en Mac. GNU todavía no implementa expresiones regulares . No sé nada de Visual Studio. La mayoría de la gente todavía usa la implementación de boost regex .
O puede usar ragel para generar una máquina de estados finitos para que haga el análisis por usted y genere 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 utiliza para generar este código https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 y este diagrama de máquina de estados finitos:
Actualización 1:
libc ++ regex de lvm funciona en ubuntu 14.04: libc ++ - dev - LLVM C ++ biblioteca estándar (archivos de desarrollo). Al compilar:
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 la expresión regular, porque tiene reglas de estilo BNF y está bien pensado. (Las bibliotecas de Spirit Qi más antiguas (más documentadas) se encuentran aquí )
fuente
Boost tiene expresiones regulares .
Eso debería llenar la factura
fuente
También puede consultar la biblioteca de expresiones regulares rápidas que se desarrolló en el motor de búsqueda Yandex para realizar coincidencias rápidas de miles de patrones con grandes cantidades de datos.
fuente
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 sintaxis completa de Perl 5. No lo he usado, pero es posible que desee probarlo.
fuente
Me enfrenté a una situación similar y terminé usando Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
fuente
Nadie aquí dijo nada sobre el que viene con C ++ 0x. Si está utilizando un compilador y el STL que admite C ++ 0x, puede usarlo en lugar de tener otra biblioteca en su proyecto.
fuente