Un ejemplo de uso de la libreria de regex de glibc, que trae herramientas basicas para las expresiones regulares.
/**
* regexp.c
* ejemplo ultrabasico de uso libreria de expresiones regulares de glibc
*
* Se debe incluir la cabecera regex.h
* No se comparan dos strings, se debe "crear" un regex_t con la funcion regcomp
* y luego ya comparamos
*
* (c) Pello Xabier Altadill Izura - www.pello.info
*/

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>

// Programa principal.
// acepta dos argumentos: una expresion regular y un string para matchear.
int main(int argc, char *argv[]){

  // este el regexp que se debe iniciar
  regex_t expresion;
  int count;


  if (argc != 3) {
        printf("Uso: %s expresion texto
",argv[0]);
        exit(1);
  }

  printf("Hola, tus argumentos han sido: ./%s %s %s

", argv[0],argv[1],argv[2]);

  // CREACION de la expresion
  // regcomp(&resultado, string-de-expresion, flag)
  // los flag: REG_EXTENDED :expresiones extendidas POSIX
  //           REG_ICASE :case insensitive
  //           REG_NOSUB : se pasa de parametros nmatch y pmatch
  //           REG_NEWLINE : en operadores globales -*,+,^ pasar del salto de linea
  if(regcomp(&expresion, argv[1] , 0) != 0){
    perror("ERROR GORDO! al crear expresion regular.");
    printf("vamos vamos que nos vamos
");
    exit(1);
  }

    // USO de la expresion
    // regexec(®ex, string-a-comparar, nmatch, pmatch, flags)
   if(regexec(&expresion, argv[2], 0, NULL, 0) == 0) {
      printf("%s <=> %s MATCH!!
",argv[1],argv[2]);
   } else {
      printf("%s <=> %s ? NO HAY MATCH
",argv[1],argv[2]);
   }

  // Liberamos la memoria okupada por la expresion. autogestion ante todo
  regfree(&expresion);

  return 0;
}