Você está na página 1de 6

Expressões Regulares

1) Introdução
Expressão regular é um método formal de se especificar um padrão de texto. É uma
composição de símbolos, caracteres com funções especiais, que, agrupados entre si e com caracteres
literais, formam uma seqüência, uma expressão. Essa expressão é interpretada como uma
padrão("pattern"), que indicará sucesso se uma entrada de dados qualquer casar("match") com essa
regra, ou seja, obedecer exatamente a todas as suas condições.

2) Metacaracteres padrão
São dividos em 4 grupos: Representantes, Quantificadores, Âncoras, Outros

2.1) Representantes
Sua função é representar um ou mais caracteres.

meta mnemônico função


---------------------------------------------------------------
. ponto um caractere qualquer
[...] lista lista de caracteres permitidos
[^...] lista negada lista de caracteres proibidos

2.1.1) Ponto
O ponto casa com qualquer coisa, inclusive com o próprio ponto, e é um curinga para casar um
caractere.
Ex:
Regex: teste.
teste123 testeabc testes teste.
No trecho acima, a regex casou 4 vezes.

Outros exemplos:
12.45 casa com 12:45, 12 45, 12.45
n.o casa com não, nao

2.1.2) Lista [ ]
A lista casa somente com quem ela conhece, ou seja com o conteúdo delimitado dentro dos
colchetes. Em comparação com o ponto permite remover casamentos indesejados, permitindo-se ser
mais específico.
Ex:
Regex:
não,n1o,n-0,nao,n.0
Os caracteres dentro dos colchetes não são interpretados como metacaracteres, ou seja, um ponto é
simplesmente um ponto. Ex:
12[:.]45 casa com 12:45 e 12.45, mas não casa com 12-45

As regex são sensíves a maiúsculas e minúsculas. Então se quisermos mais possibilidades, basta
incluí-las:
<[BIPbip]> casa com <B>, <I>, <P>, <b>, <i>, <p>
Intervalos: Somente dentro das listas, temos o conceito de intervalo, para facilitar a criação de
regras. O traço “-” é usado como caracter especial dentro das lista para representar intervalos:
[0-9] é igual a [0123456789]
Outros exemplos:
[a-z]
[A-Z]
[5-9]
[a-f]
[A-Za-z0-9]
Podemos estar querendo apenas buscar por traço dentro do conteúdo, sem tratar-se de intervalo.
Basta usá-lo normalmente. A mesma coisa vale para os colchetes. Não se pode ter uma lista dentro
da outra. Deve-se colocar o colchete "]" no começo da lista para não confundir com o colchete que
termina a lista. Ex:
Regex:[][-]
Casa ambos os colchetes e o traço.
[:-@] é igual a [:;<=>?@]
Para saber isso, deve-se entender que os intervalos respeitam a ordem numérica da tabela ASCII
Sabendo isso, podemos dizer que [A-z] não pega somente as maiúsculas e minúsculas como era de
se esperar. Ele pega caracteres como [\]^_` e não pega os caracteres acentuado. Basta consultar a
tabela ASCII.

Classes de caracteres acentuados (POSIX): POSIX é um padrão internacional utilizado para


tratar esses casos:
classe POSIX similar significa
-----------------------------------------
[[:upper:]] [A-Z] letras maiúsculas
[[:lower:]] [a-z] letras minúsculas
[[:alpha:]] [A-Za-z] maiúsculas/minúsculas
[[:alnum:]] [A-Za-z0-9] letras e números
[[:digit:]] [0-9] números
[[:xdigit:]] [0-9A-Fa-f] números hexadecimais
[[:punct:]] [.,!?:...] sinais de pontuação
[[:blank:]] [ \t] espaço e TAB
[[:space:]] [ \t\n\r\f\v] caracteres brancos
[[:cntrl:]] - caracteres de controle
[[:graph:]] [^ \t\n\r\f\v] caracteres imprimíveis
[[:print:]] [^\t\n\r\f\v] imprimíveis e o espaço

A diferença é que essas classes POSIX levam em conta a localidade do sistema e inclui as letras
acentuadas também na lista, caso seja necessário.

2.1.3) Lista Negada [^...]


A lista negada é exatamente igual à lista, podendo ter caracteres literais, intervalos e classes POSIX.
Tudo o que se aplica a lista normal, se aplica à negada também. A única diferença é que ela possui
lógica inversa, ou seja, ela casará com qualquer coisa, fora os componentes listados.

Então se [0-9] são números, [^0-9] é qualquer coisa fora números. Pode ser letras, símbolos, espaço
em branco, qualquer coisa, menos números.
Mas algum caractere é necessário, uma linha vazia não casaria nesse caso.
O circunflexo é especial, então para colocarmos um ^ literal em uma lista, precisamos pô-lo em
qualquer posição que não seja a primeira
As classes POSIX também podem ser negadas, então [^[:digit:]] casa "qualquer coisa fora números".

Ex: Procurando por qualquer caracter que não seja de acentuação, após um espaço em branco:
[:;,.!?][^ ]

2.2) Quantificadores
Servem para indicar o número de repetições permitidas para a entidade imediatamente anterior.
Não se deve confundir os caracteres curinga *,? usados na linha de comando para especificar nomes
de arquivos, como *.txt, relatorio.{txt,doc} e guia-??.html. Isso não são expressões regulares e tem
seus símbolos tem uma finalidade diferente.

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

2.2.1) O opcional ?
O opcional é um quantificador que para ele pode ter ou não a ocorrência da entidade anterior, pois
ele a repete 0 ou 1 vez.
Ex:
ondas? tem a letra s marcada como opcional, então ela casa onda e ondas.

Outro exemplo, juntando listas e o opcional:


fala[r!]?
Dica - Como ler uma ER: Lê-se átomo por átomo, da esquerda para a direita, depois entende-se o
todo e depois se analisa as possibilidades.

Separando a regex acima por partes:


f a l a r ou ! (ambos opcionais).
Então fala[r!]? casa com falar, fala!, fala

A regra é a mesma para expressões regulares grandes e complexas, que são nada mais que várias
partes pequenas agrupadas.
Ex: Casar as tags HTML de abertura e fechamento: <B>, <I>, <P>
</?[BIPbip]> casa com <b> </b> <B> </B> <i> </i>, etc.

2.2.2) O asterisco *
O asterisco é um quantificador que pode ter, não ter, ou ter infinitas repetições da ocorrência da
entidade anterior.
Ex:
6*0 0, 60, 660, 6660, ..., 666666666660, ...
bi*p bp, bip, biip, biiip, biiiip...
b[ip]* b, bi, bip, biipp, bpipipi, biiiiip, bppp, …

Ex: Casar as tags HTML de abertura e fechamento: <B>, <I>, <P>, considerando espaços em
branco dentro das tags (<b >...)
</?[BIPbip] *> casa com </B>, </B >, </B >, ..., <p >, …

2.2.2.1) O curinga .*
Juntando esses dois metacaracteres abrangentes: (qualquer caractere) e o asterisco (em qualquer
quantidade), teremos qualquer caractere, em qualquer quantidade, ou seja, ele casará com qualquer
conteúdo. Muito útil quando no meio de uma Expressão Regular, uma parte que não importa, pode
ser qualquer coisa. Então coloca-se .* e continua-se a expressão.Ex:
relatorio.*072013 casa com relatorio01072013, relatorio02072013, etc.

2.2.3) O +
O + tem funcionamento idêntico ao do asterisco, tudo o que vale para um, se aplica ao outro.
A única diferença é que o mais não é opcional, então a entidade anterior deve casar pelo menos uma
vez, e pode ter várias ocorrências.
Sua utilidade é quando queremos no mínimo uma repetição. Ex:

bi+p casa com bip, biip, biiip e não casa com com bp
b[ip]+ casa com bi, bip, biipp, bpipipi
2.2.4) As chaves {}
As chaves são usadas para uma quantificação mais controlada, quando se quer especificar
exatamente quantas repetições são desejadas para a entidade anterior. A notação usada é a seguinte:
{n,m} – significa de n até m vezes
Ex:
7{1,3} - de 1 a 3 repetições. Casa com: 7,7,777 por ex.
7{3,} - pelo menos 3 (3 ou mais). Casa com 777 por ex.
{0,3} - até 3
{3} exatamente 3
{0,1} zero ou 1 (igual ao opcional ?)
{0,} zero ou mais (igual ao asterisco)
{1,} um ou mais (igual ao mais)

2.3) Âncoras

Eles não casam caracteres ou definem quantidades, ao invés disso eles marcam uma posição
específica na linha.
Não podendo ser quantificados, então o mais, o asterisco e as chaves não têm influência sobre
âncoras.

meta mnemônico função


---------------------------------------------------------------
^ circunflexo início da linha
$ cifrão fim da linha
\b borda início ou fim de palavra

2.3.1) O início ^
O circunflexo marca o início de uma linha.Lembrando que o circunflexo também é o marcador de
lista negada, mas apenas dentro da lista (e no começo), fora dela ele é a âncora que marca o começo
de uma linha.
Ex:
^[0-9] - procurando linhas que começam com números
^[^0-9] - procurando linhas que não começam com números
O circunflexo como marcador de começo de linha só funciona como metacaracter se estiver no
começo da Expressão Regular. Senão é considerado apenas um circunflexo mesmo.

2.3.2) O fim $
O cifrão marca o fim de uma linha e só é válido no final de uma Expressão Regular.
Ex:
[0-9]$ - casa linhas que terminam com número
^$ - casa com linhas vazias
.....$ - casa com os últimos 5 caracteres de uma linha
^.{20,60}$ - casa com linhas que tenham entre 20 e 60 caracteres

2.3.3) A borda /b
A limítrofe \b marca uma borda, mais especificamente, uma borda de palavra.
Ela marca os limites de uma palavra, ou seja, onde ela começa e/ou termina.
Muito útil para casar palavras exatas, e não partes de palavras.
Entenda que "palavra" aqui é um conceito que engloba [A-Za-z0-9_]
Ex:
dia - casa com dia, diafragma, radial, melodia, bom-dia!
\bdia - casa com dia, diafragma, bom-dia
dia\b - casa com dia, melodia, bom-dia!
\bdia\b - casa com dia, bom-dia!
bom-dia! casa nos exemplo acima pois o traço e a exclamação não são parte de uma palavra.

2.4) Outros

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

2.4.1) O escape /

3) Expressões Regulares em Java


Para verificar o comportamento desses padrões de Expressões Regulares dentro da linguagem Java:
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

Você também pode gostar