Você está na página 1de 10

Lio 1 - Expresses Regulares Introduo

Uma Expresso Regular (ER) um mtodo formal de se especificar um padro de texto. uma composio de smbolos, caracteres com funes especiais, chamados "metacaracteres" que, agrupados entre si e com caracteres literais, formam uma seqncia, uma expresso. Essa expresso testada em textos e retorna sucesso caso este texto obedea exatamente a todas as suas condies. Diz-se que o texto "casou" com a expresso. A ERs servem para se dizer algo abrangente de forma especfica. Definido o padro de busca, tem-se uma lista (finita ou no) de possibilidades de casamento. Em um exemplo rpido, [rgp]ato pode casar "rato", "gato" e "pato". As ERs so teis para buscar ou validar textos variveis como: data; horrio; nmero IP; endereo de e-mail; endereo de Internet; declarao de uma funo (); dados na coluna N de um texto; dados que esto entre <tags></tags>; nmero de telefone, RG, CPF, carto de crdito. Vrios editores de texto e linguagens de programao tm suporte a ERs, ento o tempo investido em seu aprendizado recompensado pela larga variedade de aplicativos onde ele pode ser praticado. Pergunta: O que uma expresso regular? Resposta : uma maneira de procurar um texto, tendo idia das variaes possveis e no ele por completo, ou ainda uma maneira de procurar um trecho em posies especficas, uma maneira de um programador especificar padres complexos que podem ser procurados e casados em uma cadeira de caracteres e ainda pode ser uma construo que utiliza pequenas ferramendas, feita para obter determinada seqencia de caracteres de um texto.

Comando grep
Para no precisar listar todo o contedo de um arquivo por completo para apenas saber os dados do usurio "root", pode-se usar o grep para pesquisar e retornar somente a linha dele. O comando grep tem o seguinte formato: grep palavra arquivo Vamos utilizar como exemplo o arquivo /etc/passwd, que a base de usurios de um sistema UNIX/Linux. Vale a pena, antes, verificar como que se constitui esse arquivo dando o comando: $cat /etc/passwd Observa-se que sero obtidas vrias linhas, onde cada um se refere a um usurio diferente. E cada linha possui o seguinte formato: login : senha : UID : GID : Nome completo : Diretrio $HOME : shell Voltando ao grep. Para "pescar" somente a linha do usurio root faremos: aluno@computador:~$ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash Grep um comando que serve para "pescar" padres dentro de um arquivo. Voc informa o padro a ser encontrado e o grep retorna todas as linhas de texto em que ele encontrar este padro.

Os Metacaracteres

Cada metacaracteres uma ferramenta que tem uma funo especfica. Servem para dar mais poder s pesquisas, informando padres e posies impossveis de se especificar usando somente caracteres normais. Os metacaracteres so pequenos pedacinhos simples, que agrupados entre si ou com caracteres normais formam algo maior, uma expresso. O importante compreender bem cada um individualmente, e depois apenas l-los em seqncia.

1. Metacaracteres Representantes So aqueles cuja funo representar um ou mais caracteres. Ponto . Lista [...] Lista Negada [^...]

O ponto
O ponto nosso curinga solitrio, que est sempre procura de um casamento no importa com quem seja. Pode ser um nmero, uma letra, um TAB, um \@, o que vier ele traa, pois o ponto casa qualquer coisa. Exemplos: "n.o" casaria: no, nao, ... ".eclado" casaria: teclado, Teclado, ... "12.45" casaria: 12:45, 12 45, 12.45, ...

A lista
Bem mais exigente que o ponto, a lista no casa com qualquer um. Ela sabe exatamente o que quer, e nada diferente daquilo, a lista casa com quem ela conhece. Toda "lista" (os colchetes e seu contedo) vale para apenas uma posio, um caractere, por maior que seja. Exemplos: n[a]o no, nao, ... [Tt]eclado teclado, Teclado, .... 12[:. ]45 12:45, 12 45, 12.45, ... A lista de certa forma exigente. Sendo assim: EvitePrefira: [0123456789] [0-9] [0-9][0-9]:[0-9][0-9] [012][0-9]:[0-5][0-9] [A-z] [A-Za-z]

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 tambm. A nica diferena que ela possui lgica inversa, ou seja, ela casar com qualquer coisa, fora os componentes listados. Observe que a diferena em sua notao que o primeiro caractere da lista um circunflexo, ele indica que esta uma lista negada. Ento, se [0-9] so nmeros, [^0-9] qualquer coisa fora

nmeros. Pode ser letras, smbolos, espao em branco, qualquer coisa menos nmeros. Porm, ao iniciar o circunflexo (^) fora das chaves possui outro significado diferente: simboliza o incio de uma linha. Mas tem de ser alguma coisa. S porque ela uma lista negada isso no significa que ela pode casar "nada". Exemplos: [A-Z^] casa maisculas e o circunflexo e [^A-Z^] casa tudo fora isso. Como mandam as regras da boa escrita, sempre aps caracteres de pontuao como a vrgula ou o ponto, devemos ter um espao em branco os separando do resto do texto. Ento, vamos procurar por qualquer coisa que no o espao aps a pontuao:
[:;,.!?][^ ]

Metacaracteres quantificadores
Os quantificadores servem para indicar o nmero de repeties permitidas para a entidade imediatamente anterior. Essa entidade pode ser um caractere ou metacaractere. Em outras palavras, eles dizem a quantidade de repeties que o tomo anterior pode ter, quantas vezes ele pode aparecer. So eles: opcional ? asterisco * mais + chaves {}

Opcional
til para procurar palavras no singular e plural e pode ser tornar opcionais caracteres e metacaracteres. Exemplos: Expresso Casa com Ondas? Onda Ondas Senadora? Senador Senadora [BFM]?ala ala Bala Fala Mala

Asterisco
Pode aparecer em qualquer quantidade. O curinga .* o tudo e o nada, qualquer coisa. Exemplos: 6*0 0, 60, 660, 6660, ..., 666666666660, ... bi*p bp, bip, biip, biiip, biiiip... b[ip]* b, bi, bip, biipp, bpipipi, biiiiip ...

Mais
Tem funcionamento idntico ao do asterisco, tudo o que vale para um, se aplica ao outro. A nica diferena que o mais (+) no opcional, ento a entidade anterior deve casar pelo menos uma vez, e pode ter vrias. Sua utilidade quando queremos no mnimo uma repetio. Exemplos: 6+0 60, 660, 6660, ..., 666666660, ... bi+p bip, biip, biiip, biiiip... b[ip]+ bi, bip, biipp, bpipipi, biiiiip, bppp, ...

Chaves
As chaves so a soluo para uma quantificao mais controlada, onde se pode especificar exatamente quantas repeties se quer da entidade anterior. Colocando um nmero entre chaves "{ }", indica-se uma quantidade de repeties do caractere (ou metacaractere) anterior. As chaves so precisas podendo especificar um nmero exato, um mnimo, um mximo, ou uma faixa numrica. Elas, inclusive, simulam o *, + e ?. Exemplos: {n,m} significa de n at m vezes, assim algo como 6{1,4} casa 6, 66, 666 e 6666. S, nada mais que isso. {0,1} zero ou 1 (igual ao opcional) {0,} zero ou mais (igual ao asterisco) {1,} um ou mais (igual ao mais) {3} exatamente Pergunta: Quando feito o comando $ grep '^[aeiou]' /etc/passwd temos o seguinte resultado: A sua resposta :

Obtem-se uma lista de usurios cujo login comece com uma vogal. Esta a resposta correta

Metacaracteres tipo ncora


So aqueles que no casam caracteres ou definem quantidades, ao invs disso eles marcam uma posio especfica na linha. Assim, eles no podem ser quantificados, ento o mais, o asterisco e as chaves no tm influncia sobre ncoras: So eles: cincunflexo - ^ cifro - $ borda - /b

Explicando cada metacaractere

1. Circunflexo - ^
Este metacaractere (do tipo de posicionamento por representar uma posio especfica da linha) simboliza o incio de uma linha. tambm o marcador de lista negada, mas apenas dentro da lista (e no comeo), fora dela ele a ncora que marca o incio de uma linha, veja: ^[0-9] significa que casa com uma linha comeando com qualquer algarismo. O inverso disso seria: ^[^0-9]

2. Cifro - o fim $
Este similar e complementar ao circunflexo, pois representa o fim de uma linha e s vlido no final de uma expresso regular. Quando demos o comando: $ grep bash$ /etc/passwd significa que procuramos pela palavra "bash" no final da linha, ou ainda, a palavra "bash" seguida de um fim de linha.

Esse cifro o mesmo caractere que utilizado para identificar as variveis do shell, como $PWD e $HOME. Para evitar possveis problemas com a expanso de variveis, preciso "proteger" a expresso regular passada ao grep. A proteo feita colocando-se a ER entre 'aspas simples' fazendo: $ grep 'bash$' /etc/passwd Veja outros exemplos: [0-9]$ - casa linhas que terminam com um nmero ^$ - casa com linhas vazias ^.{20,60}$ - casa com linhas que tm entre 20 e 60 caracteres

3. Borda - a limtrofe \b
A borda marca os limites de uma palavra, ou seja, onde ela comea e/ou termina. muito til para casar palavras exatas, e no partes de palavras. Palavra aqui um conceito que engloba [AZa-z0-9_] apenas, ou seja, letras, nmeros e o sublinhado. Veja os exemplos: Veja como se comportam as ERs nas palavras dia, diafragma, radial, melodia e bom-dia!: dia --- dia, diafragma, radial, melodia, bom-dia! \bdia --- dia, diafragma, bom-dia! dia\b --- dia, melodia, bom-dia! \bdia\b --- dia, bom-dia! Pergunta: O comando $ egrep '^.{45}$' /etc/passwd procura por linhas que tenham 45 caracteres, quaisquer que sejam eles e sua vantagem olhar o nmero de repeties, sem precisar ficar contando um por um. A sua resposta : Verdadeiro. Esta a resposta correta

Outros metacaracteres
Vamos ver outros metacaracteres, que tm funes especficas e no relacionadas entre si, portanto no podem ser agrupados em outra classe fora a tradicional "outros". Mas ateno, isso no quer dizer que eles so inferiores, pelo contrrio, o poder das ERs multiplicado com seu uso e um mundo de possibilidades novas se abre a sua frente. So eles: escape \ ou |

grupo () retrovisor /n

Explicando-os melhor...

1. Escape - a criptonita \
Temos duas formas de casar um metacaractere dentro de uma ER: Usando Listas: Lua[*] casa com Lua* "Escapando" o Caractere: Lua\* casa com Lua* Isto , a contrabarra (\) "escapa" qualquer metacaractere, tirando todos os seus poderes. O escape to poderoso que pode escapar a si prprio! O \ casa uma barra invertida \ literal. Ento, agora que sabemos muito sobre ERs, que tal uma expresso para casar um nmero de RG? Lembre que ele tem o formato n.nnn.nnn-n, fcil! [0-9]\.[0-9]{3}\.[0-9]{3}-[0-9] O \* = [*] = asterisco literal Ironia -> O escape escapa o escape, escapando-se a si prprio simultaneamente.

2. Ou - o alternativo |
Para procurar por uma coisa ou outra, deve-se usar o pipe "|" e delimitar as opes com os parnteses " ". muito comum em uma posio especfica de nossa Expresso Regular (ER) termos mais de uma alternativa possvel, por exemplo, ao casar um cumprimento amistoso, podemos ter uma terminao diferente para cada parte do dia: boa-tarde|boa-noite O 'ou' serve para esses casos em que precisamos dessas alternativas. Essa ER se l: "ou boa-tarde, ou boa-noite", ou seja "ou isso ou aquilo". Lembre que a lista tambm uma espcie de ou (|), mas apenas para uma letra, ento: [gpr]ato o mesmo que gato|pato|rato So similares, embora nesse caso em que apenas uma letra muda entre as alternativas, a lista a melhor escolha. Em outro exemplo, o ou til tambm para casarmos um endereo de Internet, que pode ser uma pgina, ou um stio FTP http://|ftp://

3. Grupo - o pop (...)


Assim como artistas famosos e personalidades que conseguem arrastar multides, o grupo tem o dom de juntar vrios tipos de sujeitos em um mesmo local. Dentro de um grupo podemos ter um ou mais caracteres, metacarateres e inclusive outros grupos! Como em uma expresso matemtica, os parnteses definem um grupo, e seu contedo pode ser visto como um bloco na expresso. Todos os metacaracteres quantificadores que vimos anteriormente, podem ter seu poder ampliado pelo grupo, pois ele lhes d mais abrangncia. E o 'ou', pelo contrrio, tem sua abrangncia limitada pelo grupo, e pode parecer estranho, mas essa limitao que lhe d mais poder. Em um exemplo simples, (ai)+ agrupa a palavra ai e esse grupo est quantificado pelo mais (+). Isso quer dizer que casamos vrias repeties da palavra, como ai, aiai, aiaiai, ... E assim podemos agrupar tudo o que quisermos, literais e metacaracteres, e quantific-los: (ha!)+ ha!, ha!ha!, ha!ha!ha!, ... (\.[0-9]){3} .0.6.2, .2.8.9, .6.6.6, ... (www\.)?zz\.com www.zz.com, zz.com E em especial nosso amigo ou ganha limites ou seu poder cresce: boa-(tarde|noite) boa-tarde, boa-noite (#|n\.|nm) 6 # 6, n. 6, nm 6 (in|con)?certo incerto, concerto, certo Podemos criar subgrupos tambm, ento imagine que voc esteja procurando o nome de um supermercado em uma listagem e no sabe se este um mercado, supermercado ou um hipermercado. (super|hiper)mercado Consegue casar as duas ltimas possibilidades, mas note que nas alternativas super e hiper temos um trecho per comum aos dois, ento podamos "alternativizar" apenas as diferenas su e hi: (su|hi)permercado Precisamos tambm casar apenas o mercado sem os aumentativos, ento temos de agrup-los e torn-los opcionais: ((su|hi)per)?mercado Ei! E se tivesse minimercado tambm? (mini|(su|hi)per)?mercado 4. Retrovisor - o saudosista \1 ... \9 (quero)-\1 Mas esse \1 no o tal do escape? Pois , lembra que o escape (\) servia para tirar os poderes do metacaractere seguinte. Ento, a essa definio agora inclumos: a no ser que este prximo caractere seja um nmero de 1 a 9, ento estamos lidando com um retrovisor. Notou o detalhe? Podemos ter no mximo 9 retrovisores por ER, ento \10 o retrovisor nmero 1 seguido de um zero.

O verdadeiro poder do retrovisor quando no sabemos exatamente qual texto o grupo casar. Vamos estender o quero do exemplo anterior para "qualquer palavra": ([A-Za-z]+)-\1 Viu o poder dessa ER? Ela casa palavras repetidas, separadas por um trao, como o prprio quero-quero, e mais: bate-bate, come-come, etc. Mas, e se tornssemos o trao opcional? ([A-Za-z]+)-?\1 Com uma modificao pequena, fazemos um minicorretor ortogrfico para procurar por palavras repetidas como estas em um texto: ([A-Za-z]+) \1 Mas lembre-se que procuramos por palavras inteiras e no apenas trechos delas, ento precisamos usar as bordas para completar nossa ER: \b([A-Za-z]+) \1\b Como j dito, podemos usar no mximo nove retrovisores. Vamos ver uns exemplos com mais de um de nossos amigos novos: (lenta)(mente) \2 \1 lentamente mente lenta ((band)eira)nte \1 \2a bandeirante bandeira banda in(d)ol(or) sem \1\2 indolor sem dor ((((a)b)c)d)-1 = \1,\2,\3,\4 abcd-1 = abcd,abc,ab,a Repare que numeram-se retrovisores contando os grupos da esquerda para a direita. Repare que numeram-se retrovisores contando os grupos da esquerda para a direita. Ao usar um (grupo) qualquer, voc ganha um brinde, e muitas vezes nem sabe. O brinde o trecho de texto casado pela ER que est no grupo, que fica guardado em um cantinho especial e pode ser usado em outras partes da mesma ER. Ento, o retrovisor \1 uma referncia ao texto casado do primeiro grupo, nesse caso quero, ficando, no fim das contas, a expresso que queramos. O retrovisor pode ser lembrado tambm como um link ou um ladro, pois copia o texto do grupo. Como o nome diz, retrovisor porque ele "olha pra trs", para buscar um trecho j casado. Isso muito til para casar trechos repetidos em uma mesma linha. Veja bem, o texto, e no a ER. Como exemplo, em um texto, procuramos quero-quero. Podemos procurar literalmente por quero-quero, mas assim no tem graa, vamos usar o grupo e o retrovisor para fazer isso. Pergunta: Qual dos comandos abaixo corresponde a casar um par de parnteses literais, recordando-se do escape criptonita? Um exemplo seria uma funo chamada Minha_Funo . Resposta : [A-Za-z0-9_]+\(\)

Você também pode gostar