Outras Expressões Regulares comentadas
Por: Tuesday 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















# 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,