ejemplos - regex w c++
C++: ¿qué biblioteca de expresiones regulares debería usar? (10)
Boost tiene regex en él.
Eso debería llenar la cuenta
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 <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 usar en este proyecto)
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 diagrama de máquina de estados finitos:
Actualización 1:
lvm''s libc ++ regex 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 regex, porque tiene reglas de estilo BNF y está bien pensado. (Más antiguas (más documentadas) Spirit Qi libs se encuentran aquí )
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.
Enfrenté una situación similar y terminé usando Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
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 <regex.h> 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.
Nadie 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 lib en su proyecto.
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.
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.
Boost.Regex es muy bueno y está programado para convertirse en parte del estándar C ++ 0x (ya está en TR1).
Personalmente, creo que Boost.Xpressive mucho mejor para trabajar. Es una biblioteca de solo encabezado y tiene algunas características agradables, como expresiones regulares estáticas (expresiones regulares compiladas en tiempo de compilación).
Actualización: Si está utilizando un compilador compatible con C ++ 11 (¡gcc 4.8 NO lo es!), std::regex menos que tenga una buena razón para usar algo más.