Baseado no livro Guia de Expressões Regulares de Aurélio Marinho Jargas
| meta | mnemônico | função |
| . | ponto | um caractere qualquer |
| [...] | lista | lista de caracteres permitidos |
| [^...] | lista negada | lista de caracteres proibidos |
| meta | mnemônico | função |
| ? | opcional | zero ou um |
| * | asterisco | zero, um ou mais |
| + | mais | um ou mais |
| {n,m} | chaves | de n até m |
| meta | mnemônico | função |
| ^ | circunflexo | início da linha |
| $ | cifrão | fim da linha |
| \b | borda | início ou fim de palavra |
| meta | mnemônico | função |
| \c | escape | torna literal o caractere c |
| | | ou | ou um ou outro |
| (...) | grupo | delimita um grupo |
| \1...\9 | retrovisor | texto casado nos grupos 1...9 |
No mundo das ERs, temos diversas "leis" não escritas que ora ou outra vão bater a sua porta e você verá que segui-las fará com que suas ERs sejam mais precisas e não falhem.
Essas leis são um misto de dicas de prevenção de problemas e ganhos de performance. Se você está começando, não se preocupe com essas regras. Mas se você já tem uma experiência grande com ERs, verá que essas leis podem lhe poupar estresse.
Ao construir uma ER, lembre-se que um dia alguém, provavelmente você mesmo, terá de dar manutenção a ela, para arrumar algum problema ou incrementá-la. Tendo isso em mente, evite fazer construções complicadas desnecessariamente. Nem sempre a menor ER é a melhor, tudo vai depender do quão comentada ela está ou das habilidades de quem for mantê-la.
Então muito cuidado ao colocar grupos dentro de grupos, quantificar grupos, usar chaves quando se pode usar o asterisco, entre outros. Procure manter sua ER simples. Como dizem os gringos: KISS ("Keep It Simple, Stupid"), traduzindo: "deixe simples, estúpido".
Sempre que possível, comece sua ER com o circunflexo. Como já vimos, o robozinho vai tentando casá-la, caractere por caractere, da esquerda para a direita, a partir do começo da linha. Então, o ponto inicial de pesquisa, é o começo de linha.
Se você não coloca o circunflexo em sua ER, o robozinho tentará casá-la em qualquer parte da linha. Isso significa ir varrendo a linha, um por um, até chegar no final e caso não encontre o padrão, retorna falha na pesquisa.
Se você coloca o circunflexo na sua ER, forçando o casamento do começo de linha, se o primeiro componente da ER após o ^ já não casar com o primeiro caractere da linha, dali mesmo já retorna falha de pesquisa, sem precisar varrer o resto da linha.
A lista negada é um grande aliado quando não se sabe exatamente que tipo de dados estão em uma determinada posição.
Mas lembre-se: a tabela ASCII tem 255 caracteres. Dizer algo como [^:] significa negar um caractere e permitir outros 254, o que muitas vezes é um exagero.
Essa abrangência toda pode trazer resultados negativos, casando partes incorretas. Sempre que possível, tente descobrir quais as possibilidades válidas de dados em uma determinada posição e cadastre todas elas dentro de uma lista normal.
Nesse exemplo, se o tipo de dados que não pode ser os dois pontos forem letras, números e alguns símbolos, liste-os: [A-Za-z0-9,.()%!].
Quando pegamos o jeito com expressões regulares e as usamos regularmente, é comum usar o .* para qualquer situação, pois como todo curinga que se preze, é uma mão na roda. Mas à medida que você vai usando ERs para coisas mais complicadas e mais intensivamente, você começa a perceber que grande parte de seus problemas foi ter usado o curinga guloso e genérico, onde você poderia ter sido mais específico, e ele casou o que não devia.
Nem sempre é fácil trocar um curinga por outra coisa. Supõe-se que se você já o usou, é porque precisava de "qualquer coisa". Mas pare para pensar, esse qualquer coisa é realmente QUALQUER coisa? Lembre que isso é muito abrangente, o tudo e o nada. Não seria apenas "qualquer letra em qualquer quantidade" ou "quaisquer caracteres fora espaços em branco"?
Podemos evitar isso sendo mais específicos em nossa ER. Em vez de dizer <.*>, ou seja, uma marcação pode ter "qualquer coisa" antes do >, dizemos que pode ter "qualquer coisa fora o fechamento da marcação". Invocaremos a lista negada para nos ajudar nessa supertarefa, assim: <[^>]*>, ou mais visual:
um <b>negrito</b> aqui. ...xxxxxxxxxxxxxx <.*> ...xxx.......xxxx <[^>]*>
E agora a regra de ouro, aquela que acaba resumindo as outras, a mãe de todas: seja específico. Memorize bem isso: seja específico. De novo: seja específico.
Se você sempre tiver esta regra em mente ao construir uma ER, as chances de falha ficam muito reduzidas. Os metacaracteres são vários e servem para criarmos um universo de possibilidades para casarmos um texto, então o quente é fazer um universo restrito, onde todos os componentes fazem sua parte no todo, cada um com seu pedacinho.
Algumas regrinhas e dicas de como ser específico já foram vistas, mas basicamente para isso, primeiro você deve saber exatamente que tipo de dados procura. Um conhecimento do trecho que se quer casar acontece quando se pode responder a estas três perguntas:
Sabendo o que se quer, basta traduzir isso para uma ER, lembrando sempre de evitar generalizações como o ponto, o curinga, a lista negada, ignorar maiúsculas e minúsculas, não usar âncoras. Sempre descreva em detalhes suas intenções, delimitando e especificando bem sua ER.
Em outras palavras, se você está com fome, não diga simplesmente "Quero uma pizza", diga: "Quero uma pizza de calabreza, sem cebola, tamanho médio, cortada em 8 pedaços e com borda de catupiry".
"Encere à direita, lixe à esquerda e pinte para cima e para baixo."
Vamos ver uma maneira diferente e interessante de mostrar exemplos de expressões regulares: mostrando como funciona o processo criativo, passo a passo. A arte ninja milenar de criar ERs do nada.
Mentalizando seu objetivo (data, telefone), comece a primeira tentativa tímida e abrangente, usando o ponto para se ter um esqueleto genérico do que se quer casar. Teste a ER assim mesmo.
Deu certo? Então agora você trocará alguns dos pontos para ser mais específico, de acordo com as regras do tipo de dado que você quer casar. E assim segue, devagar, sempre testando cada modificação e seguindo a passos curtos, com modificações pequenas.
Ao chegar em um ponto onde já está bem específico, procure por alternativas, exceções, elas sempre existem. Aquele trecho da ER é realmente obrigatório, não seria opcional? E quando você acha que a ER está pronta, chega um dado novo um pouquinho diferente e você vê que tinha esquecido que aquilo também era válido. Para incrementar a ER, suas armas são os grupos, o ou, o opcional e as chaves.
Quando sua ER ficar grande e cheia de alternativas, é sinal de que você está conseguindo dizer ao robozinho exatamente o que quer. E assim é que se fazem ERs complicadas Daniel San, de grão em grão!
Tolo daquele que senta e quer escrever o todo de uma vez! A arte de criar ERs deve ser saboreada, sem pressa, e com inspiração. "Dê um passo após o outro pequeno gafanhoto."
Data:
dd/mm/aaaa
../../....
[0-9]{2}/[0-9]{2}/[0-9]{4}
[0123][0-9]/[0-9]{2}/[0-9]{4}
[0123][0-9]/[01][0-9]/[0-9]{4}
[0123][0-9]/[01][0-9]/[12][0-9]{3}
([012][0-9]|3[01])/[01][0-9]/[12][0-9]{3}
([012][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3}
(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3}
Telefone:
...-....
[0-9]{3}-[0-9]{4}
[0-9]{4}-[0-9]{4}
\(..\)[0-9]{4}-[0-9]{4}
\(..\) ?[0-9]{4}-[0-9]{4}
\(0xx..\) ?[0-9]{4}-[0-9]{4}
\(0xx[0-9]{2}\) ?[0-9]{4}-[0-9]{4}
(\(0xx[0-9]{2}\) ?)?[0-9]{4}-[0-9]{4}