Expressões Regulares (POSIX) em C

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

[ Hits: 25.286 ]

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


O primeiro contato



A linguagem C, em seu padrão, possui o scanf, que é o mais próximo que a Linguagem C, em si, chega de expressões regulares. Um exemplo seria ignorar determinados caracteres, ao ler o buffer do teclado.

Usaremos, como eu apresentei anteriormente, o ^, para ignorar. Para uma leitura simples, fazemos algo como:

/* input1.c */
#include <stdio.h>

int main(){
   char name[20];
   printf("What is your name? ");
   scanf("%s",&name);
   printf("%s\n",name);
  
   return 0;
}

Para compilarmos e executarmos:

gcc input1.c
$ ./a.out


Saída:

What is your name? Andre123
Andre123


Como vocês podem observar, eu fiz uma leitura simples, sem fazer quaisquer tipo de filtragem. Observem também que eu inseri números ao meu nome. Pois bem, vamos agora ignorar números na leitura, visto que não queremos que o usuário digite números. Faríamos algo como:

/* input2.c */
#include <stdio.h>

int main(){
   char name[20];
   printf("What is your name? ");
   scanf("%[^0-9]s",&name);
   printf("%s\n",name);
  
   return 0;
}

Para compilar e executar:

gcc input2.c
$ ./a.out


Saída:

What is your name? Andre123
Andre


Como vocês podem ver, na entrada (input) eu inseri números junto ao meu nome mas, ao fazer a leitura do buffer enviado pelo teclado, os números de 1 a 9 foram ignorados, como sugerimos no scanf.

Agora que tivemos o nosso primeiro contato com as tão citadas expressões regulares, não podemos deixar de conhecer o arquivo cabeçalho regex.h. Na próxima página, poderemos, sem demasiados problemas, trabalhar com o este.

O Elgio Schlemer escreveu um artigo extremamente interessante sobre o assunto, e que eu não poderia deixar de referenciar. Sugiro a leitura, será bastante esclarecedora:
Página anterior     Próxima página

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

Introdução a LUA, uma poderosa linguagem de programação

Trabalhando com classes e métodos em Java

Instalando e utilizando o LimeWire no Debian

Trabalhando com classes e métodos em Java (parte 2)

Programando em Perl (parte 2)

Leitura recomendada

Gerenciando pacotes para C/C++ com Conan

Compilando Templates C++

Ponteiros - Saindo de Pesadelos

O Produtor e o Consumidor

Reprodução de arquivos WAV com SDL_mixer e 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? [email protected]+\\.[a-z]+

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

A expressão regula [email protected]+\.[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