regular ejemplos c++ regex linux

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.



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.



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.