Expressões Regulares (POSIX) em C

Neste artigo veremos o quão simplório é trabalhar com expressões regulares em C.

[ Hits: 27.971 ]

Por: André em 18/10/2011 | Blog: http://127.0.0.1


O arquivo regex.h



Antes de mais nada, para os mais curiosos, vocês podem ver o conteúdo do arquivo cabeçalho regex.h através do comando:

cat /usr/include/regex.h

Para que possamos usufruir dos recursos disponibilizados pelo arquivo cabeçalho regex.h, precisamos incluir este arquivo ao nosso código fonte. Para isso, bastará colocar a linha:

#include <regex.h>

Vamos agora declarar uma variável do tipo regex_t. Chamaremos essa variável de "reg":

regex_t reg;

Neste artigo, para que possamos trabalhar com expressões regulares em C, basicamente precisaremos conhecer duas funções, apenas: A regcomp e a regexec. Uma é responsável pela compilação da expressão regular, e a outra por executá-la (ou casa-la, como chamam aqui no Brasil).

Vale lembrar que ambos retornam 0, caso seu uso seja bem sucedido. Vamos colocar estas funções dentro de uma estrutura de decisão, para que possamos ter certeza de que não ouve problemas ao compilar e ao "casar" a expressão regular.

Basicamente, o uso destas funções é feito desta forma:

/* compilação da expressão regular */
regcomp(®, <expressão_regular>, REG_EXTENDED|REG_NOSUB)

/* execução da expressão regular */
regexec(®, <text>, 0, (regmatch_t *)NULL,0)

Onde:
  • <expressão_regular>, sem as tags (< >), à sua expressão regular, obviamente;
  • <texto>, sem as tags, o texto no qual você quer aplicar a expressão regular.

Com isso, você já tem tudo que precisa para usar expressões regulares em C. Para concluir, criaremos um programa para fazer a validação de um e-mail, que será passado pelo usuário.

#include <stdio.h>
#include <regex.h>
#define EXPR_REG ".+@.+\\.[a-z]+"

int main(){
   char mail[40];
   regex_t reg;

   printf("Seu e-mail: ");
   scanf("%s",&mail);
  
   if (regcomp(&reg, EXPR_REG, REG_EXTENDED|REG_NOSUB) != 0){
      printf("Expressao regular invalida!\n");
      return 1;
   } else {
      if ((regexec(&reg, mail, 0, (regmatch_t *)NULL,
      0)) == 0) {
            printf("E-mail valido\n");
         } else {
            printf("E-mail invalido\n");
         }
      }
   return 0;
}

Onde "#define EXPR_REG ".+@.+\\.[a-z]+"", definimos uma macro chamada EXPR_REG, contendo à seguinte expressão regular:

.+@.+\\.[a-z]+

Responsável pela validação do e-mail. O que resta, não tem a ver com o arquivo regex.h em sí, e sim com a linguagem C. Vamos compilar e executar:

gcc file.c -o file
$ ./file

Seu e-mail: andre.rosa36@gmail.com
E-mail valido


Ótimo. Vamos agora inserir um e-mail em um formato inválido:

./file
Seu e-mail: hfuhfuhf887@aaaaaaaaa
E-mail invalido


Pronto! Agora basta se aprofundar e usar de acordo com sua necessidade.

Espero que o artigo tenha cumprido sua meta, que é sanar as demais dúvidas e passar o conteúdo a quem estava perdido com relação a isso.

Não deixe de ler meus demais artigos:
André Rosa.

Página anterior    

Páginas do artigo
   1. Introdução
   2. O primeiro contato
   3. O arquivo regex.h
Outros artigos deste autor

Pentesting on PHP apps: XSS

Variáveis, if, else e unless em Ruby

Livestation - Assista TV em seu GNU/Linux

Instalando o Debian em uma máquina virtual (VirtualBox)

A profissão: Programador

Leitura recomendada

PostgreSQL - Embutindo comandos SQL no seu código C

C - Include e Makefile

BSD Sockets em linguagem C

A mágica do polimorfismo e seus conceitos na ótica de C/C++

Ponteiros void na linguagem C

  
Comentários
[1] Comentário enviado por andrezc em 18/10/2011 - 13:58h

Só um pequeno adendo:
Não sei por que motivo, mas onde está o caractere '®', deveria estar ®.



Vou ver se entro em contato com o Fábio, para corrigir.

[2] Comentário enviado por levi linux em 18/10/2011 - 14:10h

Excelente artigo, muito interessante.
Ia justamente perguntar como inserir esse símbolo.
Parabéns!

[3] Comentário enviado por WhiteHawk em 19/10/2011 - 07:04h

Parabéns! Gostei muito desse artigo.

Tive apenas uma dúvida, sobre a expressão regular em si, e não sobre a programação.

Qual a função da seguinte expressão regular? .+@.+\\.[a-z]+

[4] Comentário enviado por _m4n14c_2 em 20/10/2011 - 03:54h

A expressão regula .+@.+\.[a-z]+ significa o seguinte:

.+ => . quer dizer que a expressão pega qualquer caracter, + quer dizer que o . deve pegar ao menos 1 caracter, mas podem ser mais de um, até infinitos...
@ => corresponde ao caracter @ do email
.+ => a mesma coisa que o primeiro .+
\. => a barra invertida modifica o caracter .,que normalmente representa qualquer caracter, para corresponder apenas a um ponto literal. Em C a barra invertida é usada para escapar outros caracteres, como \n,\t, \", por isso quando queremos colocar uma barra invertida, em c,temos que usar \\;
[a-z] corresponde a qualquercaracter entre 'a' e 'z'. O + significa que o [a-z] pode pegar um ou mais caracteres.

[5] Comentário enviado por WhiteHawk em 03/01/2012 - 08:44h

@m4n14c, agradeço-lhe pela resposta.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts