Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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://
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_]+\(\)