• Publicidad

Expresión regular en C

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Expresión regular en C

Notapor BigBear » 2012-11-10 10:27 @477

Tengo una duda desde hace tiempo sobre cómo hacer la típica expresión regular de Perl en C.

La idea sería la clásica variable que tenga "hola doddy mundo" y poder sacar "doddy" mostrándolo por pantalla; algo así:

my $test = "hola doddy mundo";

if($test=~/hola (.*) mundo/) {
print $1;
}

¿ Cómo se haría esto en C ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Expresión regular en C

Notapor explorer » 2012-11-10 11:28 @519

Deberías crear un programa en C que incluyese (#include) alguna biblioteca de procesado de expresiones regulares (C por defecto no tiene soporte para casi nada).

Luego, reservas un char * con la cadena a procesas, otro más con la cadena patrón, y se lo envías como argumentos a la función apropiada dentro de la biblioteca.

El resultado será escrito, seguramente, en algún array que previamente habrás tenido que reservar memoria, en que cada elemento es un puntero a un char * donde se almacenarán las capturas de grupo, más un valor de verdad que indica la concordancia del patrón con la cadena, más un valor opciones con la posición en la que ha quedado parado el motor de coincidencias (para ser usado en la próxima búsqueda de coincidencias repetitivas).

Hay varias bibliotecas para hacer esto. Aquí tienes un ejemplo con la biblioteca POSIX:
Sintáxis: [ Descargar ] [ Ocultar ]
Using c Syntax Highlighting
  1. #include <regex.h>        
  2. regex_t regex;            /* nuestra estructura regex */
  3. int reti;                 /* valor de retorno de las llamadas */
  4. char msgbuf[100];         /* un pequeño buffer para escribir mensajes */
  5.  
  6. /* Compilar la expresión regular */
  7. reti = regcomp(&regex, "^a[[:alnum:]]", 0);             /* Compilamos /^a[[:alnum:]]/ */
  8. if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }
  9.  
  10. /* Ejecutamos la expresión regular */
  11. reti = regexec(&regex, "abc", 0, NULL, 0);              /* contra la cadena "abc" */
  12. if( !reti ){
  13.     puts("Match");                                      /* Éxito: coincide */
  14. }
  15. else if( reti == REG_NOMATCH ){
  16.     puts("No match");                                   /* No coincide */
  17. }
  18. else{                                                   /* Se produjo un error; informamos */
  19.     regerror(reti, &regex, msgbuf, sizeof(msgbuf));
  20.     fprintf(stderr, "Regex match failed: %s\n", msgbuf);
  21.     exit(1);
  22. }
  23.  
  24. /* Liberamos el espacio reservado por la expresión regular */
  25. regfree(&regex);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Por Internet tienes muchos más ejemplos.

Si quieres usar una biblioteca parecida (idéntica) a la que usa Perl, debes usar la biblioteca PCRE. Si vas a necesitar expresiones sencillas, puedes resolverlo con puro código C, como demostraron los legendarios Kernighan y Pike, con un ejemplo para grep. También hay herramientas que pueden transformar expresiones regulares a código C, como re2c.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Programación en general

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados