Outras Expressões Regulares comentadas

Por: Flávio Theruo KaminisseTuesday 17 October 2006 às 11:34 AM

No artigo Workshop “Expressões Regulares” expliquei alguns exemplos que foram apresentados na Apresentação de Expressões Regulares, mas alguns exemplos só apareceram na apresentação e não os expliquei.

Recebi alguns pedidos para explicar um pouquinho cada exemplo, então mãos à massa.

^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[1-3][0-9]{3}$: Um exemplo simples de uma Expressão Regular para validar uma data, no artigo Validações e Expressões Regulares, expliquei cada passo da expressão, vale conferir.

^[a-zA-Z0-9_\.-]{2,}@([A-Za-z0-9_-]{2,}\.)+[A-Za-z]{2,4}$: Este exemplo apresenta uma validação para endereços eletrônicos, ou seja, e-mail. Ela é relativamente simples, mas vou explicar algumas partes dela, temos nesta parte ^[a-zA-Z0-9_\.-]{2,}@ uma seqüência de dois ou mais caracteres, sendo eles letras a-z ou então, A-Z, números e caracteres especias, como _ (underline), . (ponto) e – (hífem), seguidos pelo @, ou seja, nesta parte validamos o nome de usuário, na segunda parte, ([A-Za-z0-9_-]{2,}\.)+[A-Za-z]{2,4}$, temos a validação do host, que é bem parecida com a validação do username.

^([0-1][0-9]|[2][0-3]):[0-5][0-9]$: Se na validação de data precisamos usar além de Expressão Regular mais alguma programação, nesta validação de hora, basta simplesmente a Expressão Regular, na primeira parte ^([0-1][0-9]|[2][0-3]):, temos a validação da hora, ou seja, o primeiro digito da hora deve ser 0 ou 1 e o segundo digito deve estar entre 0 e 9, sendo assim temos as horas entre 00 e 19, ou então, o primeiro digito sendo 2 e o segundo variando de 0 a 3, nos gerando uma hora de 20 a 23, tudo isso seguido de :, na segunda parte temos [0-5][0-9]$, que representa os minutos, seguindo a mesma idéia anterior, temos os minutos variando entre 00 e 59, sendo assim, esta pequena, mas nem por isso simples Expressão Regular, sozinha faz a validação de um horário.

^\d{0,}$: Expressão Regular simples e muito útil, esta pequena expressão é utilizada para verificar campos que aceitam somente números, ou seja, digitos de tamanho 0 até infinito.

^\(\d{2}\) \d{4}-\d{4}$: Outra expressão bem simples que é utilizada para construir máscaras para telefone, pois temos um ( (abre parêntese) seguido de dois números e depois um ) (fecha parêntese), logo depois 4 digitos seguido de um – (hífem) seguido de 4 digitos, ou seja um telefone no formato “(33) 3333-3333″.

^(\d{3})\.(\d{3})\.(\d{3})-(\d{2})$ ou ^((\d{3})\.){2}(\d{3})-(\d{2})$: Estes dois exemplos ilustram como podemos fazer uma validação para CPF, lembrando que esta expressão apenas valida o formato do CPF, o algoritmo de validação completa para o CPF, pode ser tema de um futuro artigo. Explicando um pouco a segunda expressão, pois a primeira é bem simples, mas não necessariamente fácil, então, quem tiver dúvida, pode escrever. A primeira parte da segunda expressão é ^((\d{3})\.){2}, explicando em partes temos, ((\d{3})\.), que significa três digitos seguidos de um ponto, só que ainda temos um {2}, que significa que o elemento anterior irá se repetir duas vezes, simplificando temos que a expressão ^((\d{3})\.){2}, é o mesmo que ^(\d{3})\.(\d{3})\., ou seja, três digitos um ponto três digitos e um ponto, o restante da expressão é simples, pois temos (\d{3})-(\d{2})$, que é o mesmo que dizer que temos três números seguidos de um hífem seguido de dois números, nos dando como resposta a máscara: 999.999.999-99, que é a mascara de um CPF.

Na apresentação dos exemplos eu perguntei se eu poderia subistituir as expressões acima por outras utilizando retrovisores, será que eu posso utilizar estas expressões ^(\d{3})\.\1\.\1-(\d{2})$ ou ^((\d{3})\.)\1\2-(\d{2})$? Antes de responder a pergunta, vou explicar novamente a segunda expressão ^((\d{3})\.)\1\2-(\d{2})$, que parece muito complexa, mas até que não é, explicando por partes temos ^((\d{3})\.), três digitos seguidos de um ponto, a segunda parte são os retrovisores \1\2, o primeiro retrovisor representa os três digitos seguido de um ponto, já o segundo retrovisor representa três digitos, a terceira parte -(\d{2})$ é um hífem seguido de dois digitos, então temos a mesma representação anterior 999.999.999-99, então poderíamos subistituir esta expressão ^((\d{3})\.){2}(\d{3})-(\d{2})$, por uma menor ^((\d{3})\.)\1\2-(\d{2})$? Mas a resposta é não, isso mesmo, não. Por um simples motivo, os retrovisores casam com o conteúdo e não com a Expressão Regular em si, então um se testássemos um CPF 222.222.222-33 a segunda expressão ^((\d{3})\.)\1\2-(\d{2})$ iria falar que o formato está correto, pois a primeira parte seria 222. o primeiro retrovisor 222. e o segundo retrovisor 222, e o restante da expressão casaria com o hífem e os dois digitos, mas se testássemos um CPF: 012.345.678-99 que tem o formato correto de um CPF a expressão ^((\d{3})\.)\1\2-(\d{2})$ retornaria erro, pois o primeiro retrovisor seria 012. e o segundo retrovisor 012, ou seja, 012. é diferente de 345., e também 012 é diferente de 678, mas lembrando que esta parte nem seria analisada pela expressão, pois a partir do momento que uma parte não casa com a expressão, esta já retorna erro. Então não podemos substituir a expressão ^((\d{3})\.){2}(\d{3})-(\d{2})$ por ^((\d{3})\.)\1\2-(\d{2})$, mesmo a segunda sendo mais compacta.

<[iI][mM][gG]([^s|S]*)([sS][rR][cC]=\"[^\"]*\")[^>]*>: Esta expressão bem estranha foi feita por mim para localizar todas as tags <img> dentro de um documento html, acho que ela é bem intuitiva, mas vou explicar passo a passo, a primeira parte <[iI][mM][gG] localiza < seguido de img, sendo que img pode ser escrito de qualquer maneira, a segunda parte ([^s|S]*) localiza todos os atributos da tag <img> que não começam com a letra s, ou seja, até o atributo src, a terceira parte, ([sS][rR][cC]=\"[^\"]*\"), pega todo o atributo src, já a quarta parte, [^>]*> pega o restante dos atributos da tag <img> até o seu fechamento. Acreditem esta Expressão Regular funciona, é claro que podem ser feitos alguns ajustes, então quem se habilitar ;) .

([uU][rR][lL]\([^\)]*\)): Esta expressão serve para localizar imagens que são colocadas através em background. A explicação dela é bem simples, mas quem não tiver entendido alguma coisa, pode postar no comentário, ou então entrar em contato.

(http|https|ftp|mailto):)?(//)?(\w+([\.@]\w+)*?)(?:/|@)?
([^\"\?]*?)?(?:\?([^\?\"]*?))?([^;:\(\)#])$: Esta expressão é bem parecida com a da tag img, mas a intensão dela é localizar qualquer link dentro de um documento html, vou explicar esta expressão, mas vou tentar se o mais sintético possível, a primeira parte (http|https|ftp|mailto):)? busca qualquer link que comesse por http: ou https: ou ftp: ou mailto:, mas lembre-se que o aparecimento desta parte é opcional, a segunda parte, (//)? é o // que também é opcional, e o restante da expressão (\w+([\.@]\w+)*?)(?:/|@)?([^\"\?]*?)?(?:\?([^\?\"]*?))?([^;:\(\)#])$ é utilizada para localizar o restante do endereço, não expliquei esta parte pois ela pega algumas seqüências que um endereço deve ter, esta expressão tem seus erros, mas funciona em vários casos, novamente quem se habilitar deixar esta expressão totalmente correta, fiquem a vontade ;) .

^\d{2}\.\d{3}-\d{3}$: Esta expressão é bem simples e acaba que não tendo nada novo, ela serve para validar o formato do CEP: 99.999-999. Todos os detalhes dela já foram abordados anteriormente.

^[-+]?\d{1,3}(\.\d{3})*,\d{2}$: Esta expressão serve para validar qualquer valor monetário, lembrando que o formato é o brasileiro, a primeira parte, ^[-+]?, o valor pode começar com + ou com -, ou então nenhum dos dois, na segunda parte, \d{1,3} temos de um a três digitos, na terceira parte, o mais interessante neste caso, (\.\d{3})* aqui temos um ponto seguido de três digitos que podem aparecer nenhuma ou então infinitas vezes, viram o legal? Nesta parte podemos ter milhares, milhões, bilhões, trilhões sem nenhum esforço, e caso seja uma centena, dezena ou unidade, ela simplesmente não aparece, na quarta parte, ,\d{2}$ temos a virgula seguida de dois digitos.

Espero que tenham gostado destas explicações, e caso ainda tenham alguma dúvida, postem comentários e vamos discutir, ou então entrem em contato.

Artigos relacionados:

Tags: Dicas Expressões Regulares Internet Tecnologia Validações XHTML

4 Comentários para “Outras Expressões Regulares comentadas”

# 1° Willian October 17th, 2006 às 4:19 PM GMT

Bem legal seu post!

Depois que aprendi a trabalhar com expressões regulares (http://guia-er.sourceforge.net/guia-er.html) minha vida melhorou muito na hora de programar, validar algum coisa.

Mande mais exemplos, se tiver…rs

Abraços,

# 2° Flávio Theruo Kaminisse October 17th, 2006 às 4:41 PM GMT

@Willian depois que descobri e aprendi um pouco sobre as expressões regulares, pode ter certeza que minha vida também ficou muito mais fácil.
Se você tiver mais exemplos também, coloque-os nos comentários, ou senão me envie para eu postar aqui no blog.
E assim que tiver mais exemplos posto por aqui também ;) .
Abraços

# 3° Ciro Feitosa October 18th, 2006 às 8:20 AM GMT

Excelente artigo. Objetivo e foco na prática. Concerteza, as expressões regulares, tornam as críticas mais fáceis de serem manipuladas.

Abraço Flávio!

# 4° » Aprenda Expressões Regulares de uma vez por todas December 21st, 2006 às 2:46 PM GMT

[...] Outras Expressões Regulares comentadas [...]

Avisos
Os ítens com asterisco ( * ) são campos de preenchimento obrigatório.
Todos os links inseridos nos comentários possuem o atributo rel="nofollow" para impedir com que user agents (como os mecanismos de busca) sigam os links inseridos para desestimular spammers.
Todos devem se identificar através de e-mail válido.
Os e-mails dos usuários não serão divulgados no site.
Comentários:
  • Sigam-me no Twitter

Sobre o Japs

Foto do autor Flávio Theruo Kaminisse O Japs é o site pessoal do Flávio T. Kaminisse, atualmente trabalha com Análise de sistemas na Webroom Soluções Interativas, é formado em Ciência da Computação pela Universidade Federal de Uberlândia, é também especialista em Banco de Dados, tendo concluído sua pós-graduação pela Unitri, gosta de mexer um pouco com Linux, é responsável pela área de TI do Charges.com.br e Webinsider, e ainda arruma um tempinho para escrever sobre tecnologia, javascript, AJAX, desenvolvimento e outros assuntos interessantes por aqui. Leia mais.

Você ainda não tem estes livros na sua biblioteca? Cuidado! Você está ficando desatualizado.

  • Sistemas de Banco de Dados - Ramez E. Elmasri, Shamkant Navathe
  • PHP: a Bíblia - Tim Converse, Joyce Park
  • MySQL: a Bíblia - Steve Suehring
  • Fundamentos do Ajax - Ryan Asleson, Nathaniel T. Schutta
  • Hackers Expostos - Stuart Mcclure, Joel Scambray, George Kurtz
  • PHP 5: Programação Poderosa - Gutmans, Bakken, Rethans
  • Não me faça pensar! - Steve Krug
  • Google Adwords a Arte da Guerra - Ricardo Vaz Monteiro
  • Sandman - Neil Gaiman
  • The Art and Science of Web Design - Jeffrey Veen
  • Ansiedade de Informação 2 - RICHARD SAUL WURMAN
  • Mobile Web Design - Cameron Moll

838 assinantes Assine o feed do Japs

Artigos por e-mail

Receba os últimos artigos do Japs no seu e-mail.


Encontre-me

O Japs recomenda

Blogs amigos:

Alguns sites e blogs que valem a pena ser visitados:

Pessoas que trabalham comigo:

Sites dos colegas de trabalho na Webroom.

Já trabalharam comigo: