C ++: ¿que biblioteca de expresiones regulares debería usar? [cerrado]

107

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)

Stéphane
fuente
20
En caso de que alguien esté buscando pistas en esta vieja pregunta ... recientemente apareció una nueva biblioteca que merece ser mencionada: RE2 de Google: code.google.com/p/re2
Stéphane
2
Este es un contenedor de C ++ para la nueva biblioteca PCRE2 (versión revisada de PCRE).
Jahid

Respuestas:

80

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.

Ferruccio
fuente
4
Boost está lleno de errores y parece carecer de estándares de codificación y proceso de control de calidad. No es realmente adecuado para software de producción. Eso incluye su equipo Regex, que usa C (en lugar de C ++) en algunos lugares e incluye desbordamientos de búfer debido a funciones inseguras como sprintf. Cuando informé de un montón de errores después de una auditoría, permanecieron "no reconocidos" meses después del informe. Úselo bajo su propio riesgo.
jww
8
Casi 5 años después, intenté hoy usar std :: regex, pero resulta que aún no se ha implementado en GCC. Ver stackoverflow.com/questions/15671536/…
Stéphane
2
esa buena razón para no usar std :: regex o boost :: regex sería que boost :: regex, es alrededor de 10 veces más lento que re2
Arsen Zahray
3
@jww No, el estándar C ++ (C ++ 03 TR, C ++ 11 y C ++ 1y) ha decidido incorporar varias bibliotecas boost al estándar . Eso significa que, para todos los propósitos prácticos, Boost hizo el estándar. Hacer afirmaciones sin evidencia usando palabras comadrejas como "probablemente" y usar ataques personales no hace nada para cambiar el hecho de que gran parte de boost ahora es C ++, y muchas de las personas que definen la dirección moderna de C ++ también están trabajando en boost.
Alice
3
@Alice: los comités C y C ++ crean estándares. No incorporan bibliotecas. No tengo conocimiento de que hayan creado una biblioteca.
jww
22

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.

Stéphane
fuente
19

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.

Greg Hewgill
fuente
16

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.

Kasprzol
fuente
¿Qué compilador tiene TR1? Mi copia de g ++ 4.1.2 (Debian Etch) no tiene soporte para #include <regex> pero gracias por llamar mi atención sobre TR1, lo había olvidado. Para otros interesados ​​en saber más sobre TR1 y C ++ 0x, consulte en.wikipedia.org/wiki/Technical_Report_1
Stéphane
A partir de SP1, Visual Studio 2008 tiene la mayor parte de TR1, incluida la expresión regular. Sé que no te ayuda en Linux, pero otros pueden estar interesados. Dinkumware también es compatible con TR1 en gcc.
Michael Burr
Como escribí, si su biblioteca estándar
Kasprzol
3
g ++ 4.5.0. TR1 vive en tr1 / regex. Por ejemplo: #include <tr1 / regex>
Ogre Psalm33
11

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:

diagrama de estado


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í )

matiu
fuente
6

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.

Roel
fuente
8
GRETA ( research.microsoft.com/en-us/downloads/… ) fue creado por Eric Niebler cuando trabajaba en Microsoft (1998-2001 a partir de los archivos de encabezado de GRETA). Eric Niebler luego hizo en 2007 Boost.Xpressive. La gente debería usar Boost.Xpressive porque es más nuevo y tiene una licencia mejor que el "acuerdo de licencia de usuario final de Microsoft Research"
Cristian Adam
1
Lo siento, no veo qué tan bueno sea extraer la biblioteca de Boost. La última vez que verifiqué la descarga local de la versión sin comprimir de boost fue de 400 megas. Sin mencionar la locura de la plantilla inútil que obtienes con boost. Lo siento, recomiendo la respuesta de Gregs.
Chad
@Chad ¿Porque boost es un conjunto bien conocido y considerado de bibliotecas estándar que son útiles en muchas situaciones? Si el tamaño de la descarga es demasiado grande para usted, use BCD para quitar todo lo que no necesite; boost.regex es bastante pequeño cuando se elimina de esta manera.
Alice
1

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.

RedX
fuente
1
Si observa la respuesta más votada (de hace más de 2 años), menciona esto.
Mateen Ulhaq