c expresión regular howto

Han pasado 10 años desde que miré c. Necesito escribir un pequeño progtwig en c que analice una cadena. Quería usar expresiones regulares ya que los he estado usando durante años, pero no tengo idea de cómo hacerlo en c. He pasado la mañana buscando en Google y no puedo encontrar ningún ejemplo sencillo (es decir, usar esta biblioteca, esta es la metodología). ¿Puede alguien darme un ejemplo simple?

¡Gracias!

Puedes usar PCRE :

La biblioteca PCRE es un conjunto de funciones que implementan la comparación de patrones de expresiones regulares con la misma syntax y semántica que Perl 5. PCRE tiene su propia API nativa, así como un conjunto de funciones de envoltura que corresponden a la API de expresiones regulares POSIX. La biblioteca PCRE es gratuita, incluso para la construcción de software comercial.

Vea pcredemo.c para un ejemplo de PCRE.

Si no puede usar PCRE, es probable que el soporte de expresiones regulares POSIX esté disponible en su sistema ( como lo señaló @tinkertim ). Para Windows, puede usar el paquete gnuwin Regex para Windows .

La documentación de regcomp incluye el siguiente ejemplo:

 #include  /* * Match string against the extended regular expression in * pattern, treating errors as no match. * * Return 1 for match, 0 for no match. */ int match(const char *string, char *pattern) { int status; regex_t re; if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { return(0); /* Report error. */ } status = regexec(&re, string, (size_t) 0, NULL, 0); regfree(&re); if (status != 0) { return(0); /* Report error. */ } return(1); } 

Si es forzado solo a POSIX (no pcre), aquí hay un poco de retroceso:

 #include  #include  bool reg_matches(const char *str, const char *pattern) { regex_t re; int ret; if (regcomp(&re, pattern, REG_EXTENDED) != 0) return false; ret = regexec(&re, str, (size_t) 0, NULL, 0); regfree(&re); if (ret == 0) return true; return false; } 

Podrías llamarlo así:

 int main(void) { static const char *pattern = "/foo/[0-9]+$"; /* Going to return 1 always, since pattern wants the last part of the * path to be an unsigned integer */ if (! reg_matches("/foo/abc", pattern)) return 1; return 0; } 

Recomiendo hacer uso de PCRE si está disponible. Pero, es bueno comprobarlo y tener algún tipo de retroceso.

Saqué los fragmentos de un proyecto actualmente en mi editor. Es solo un ejemplo muy básico, pero le ofrece tipos y funciones para buscar en caso de que los necesite. Esta respuesta aumenta más o menos la respuesta de Sinan.

Otra opción además de una biblioteca C nativa es usar una interfaz para otro idioma como Python o Perl. No tener que lidiar con el manejo de cadenas de C, y el mejor soporte de idioma para las expresiones regulares debería hacer las cosas mucho más fáciles para usted. También puede usar una herramienta como SWIG para generar envoltorios para llamar al código desde C.

También deberías echar un vistazo a la biblioteca de expresiones regulares. Utiliza expresiones regulares como las que puedes escribir en el shell de Linux.

Para más información, bajo Linux, escriba “man regcomp” sin comillas