A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Linguagem Perl - Expressões Regulares

Sex

21

Nov

2008


12:55

(11 votos, média 3.91 de 5) 


Expressões Regulares são padrões de procura definidos para caracteres e cadeias de caracteres (strings). Com a ajuda destes padrões pode-se pesquisar e processar o conteúdo de variáveis. Para tarefas de CGI, as expressões regulares são de importância vital. Os componentes de um fluxo de dados de um formulário HTML que seja enviado a um programa CGI, por exemplo, podem ser identificados através do uso das expressões regulares. Da mesma forma, com a ajuda de expressões regulares, é possível fazer a leitura ordenada de arquivos (por exemplo, de um livro de visitas) de acordo com uma regra e transmitir os dados como código HTML a um navegador requisitante. E, finalmente, as expressões regulares constituem um meio poderoso de procura de expressões complexas em grandes volumes de dados.

Para os principiantes as expressões regulares parecem estranhas e são o motivo de alguns scripts Perl terem sequências de caracteres crípticos de aparência ameaçadora. Quem por acaso souber lidar com o comando UNIX/Linux grep, não terá dificuldades de se acostumar com as expressões regulares da Perl.

Utilizando expressões regulares

Para poder usar as expressões regulares é necessário conhecer todas as possibilidades que elas oferecem. Exemplo 1:

#!/usr/bin/perl $Dados = $ENV{'PATH'}; if($Dados =~ /PERL/) # Contém a sequência de caracteres 'PERL'? { print "Hehe, na sua variável PATH existe a palavra PERL!\n"; } else { print "Infelizmente na sua variável PATH não existe a palavra PERL!\n"; }

Exemplo 2:

#!/usr/bin/perl @Cidades = ( "Sampa", "Paris", "Londres", "Madri", "Atenas", "Roma", "Lisboa", "Estocolmo", "Kopenhagen"); for(@Cidades) { if(/[MKS]/) # Todas cidades que contenham 'M', 'K' ou 'S' { print "A cidade ", $_, " corresponde ao modelo de busca\n"; } }

Exemplo 3:

#!/usr/bin/perl open(ARQUIVOLOG,") { /index.htm/ ? $Acessos = $Acessos + 1 : $Acessos = $Acessos; } print $Acessos, " Acessos do arquivo index.htm!\n"; close(ARQUIVOLOG);

Normalmente é possível identificar uma expressão regular em Perl através das duas barras / ... /. A expressão regular fica localizada entre as duas barras.

Antes de utilizar uma expressão regular, é necessário ter um objetivo de busca ou procura. A busca pode ser, por exemplo, um valor que esteja armazenado numa escalar (como no exemplo 1) ou os valores constantes nos elementos de uma matriz (como no exemplo 2), ou valores que ocorram em linhas de texto de um arquivo (como no exemplo 3).

No exemplo 1 pesquisa-se a existência da sequência de caracteres "PERL" na variável de contexto PATH. Observe que uma sequência de caracteres contida numa expressão regular não fica entre aspas. No exemplo, o conteúdo de $ENV{'PATH'} é armazenado na escalar $Dados. Efetua-se a procura da seqüência de caracteres "PERL" com if($Dados =~ /PERL/). O importante, neste caso, é o operador de busca =~. Portanto, com expressões if do tipo if($NomeDaEscalar =~ /expressão regular/) é possível efetuar buscas no conteúdo das escalares desejadas.

No exemplo 2 define-se uma matriz com nomes de cidades. Dentro do laço for, todos os elementos desta lista (ou seja, os nomes das cidades) são submetidos à procura das letras M, K ou S. A busca é formulada com if(/[MKS]/). Neste caso, ao contrário do exemplo 1, não foi utilizado um operador de busca porque, devido ao laço for, a busca é sempre efetuada no elemento atual da matriz. Também é possível efetuar a procura utilizando-se a variável predefinida $_ através de if($_ =~ /[MKS]/). Entretanto, como está claro qual valor está sob busca, a forma reduzida if(/[MKS]/) também é suficiente.

No exemplo 3, um arquivo de log é lido linha a linha. Procura-se neste arquivo a ocorrência de "index.htm". Se um linha contiver a referida sequência de caracteres, o contador é incrementado. Se não, o contador permanece inalterado. No final, o valor do número de index.htm encontrados é apresentado. A expressão regular deste exemplo aparece numa expressão condicional simplificada. A expressão regular é simplesmente testada se é verdadeira ou falsa. Se for verdadeira ("index.htm" existe na linha atual), a diretiva da esquerda dos dois pontos : é executada; se for falsa, a diretiva da direita é executada. (Veja também o tutorial Linguagem Perl - Arquivos para complementar o tema arquivos).

info Observação: Uma das grandes aplicações das expressões regulares é em buscas e substituições em strings. Também podem ser parâmetros de algumas funções Perl.

Expressões Regulares para Caracteres Isolados

Com expressões regulares é possível

  • procurar um determinado caractere
  • procurar por vários caracteres
  • procurar por um caractere num determinado contexto
( 1)/a/# encontra 'a'
( 2)/[ab]/# encontra 'a' ou 'b'
( 3)/[A-Z]/ # encontra todas as letras maiúsculas
( 4)/[0-9]/# encontra números
( 5)/\d/# encontra números - como em (4)
( 6)/\D/ # encontra tudo exceto números
( 7)/[0-9]\-/ # encontra números ou o sinal de menos
( 8)/[\[\]]/ # encontra tudo que estiver contido em colchetes [ ]
( 9)/[a-zA-Z0-9_]/ # encontra letras, números ou sinal de sublinhado
(10)/[\w]/ # encontra letras, números ou sinal de sublinhado - como em (9)
(11)/[\W]/ # encontra tudo, exceto letras, números e sinal de sublinhado
(12)/[\r]/ # encontra o sinal de retorno de carro (típico do DOS)
(13)/[\n]/ # encontra o sinal para quebra de linha
(14)/[\t]/ # encontra o sinal de tabulação (tab)
(15)/[\f]/ # encontra o sinal para quebra de página
(16)/[\s]/ # encontra o sinal de espaço assim como os sinais referidos de (12) a (15)
(17)/[\S]/ # encontra tudo, exceto sinal de espaço e os de (12) a (15)
(18)/[^äöüÄÖÜ]/ # encontra todos os caracteres com trema
(19)/[^a-zA-Z]/ # encontra tudo que não contiver letras
(20)/[ab]/s # encontra 'a' ou 'b' também em várias linhas

Quando se pesquisa a existência de caracteres isolados em expressões regulares, é necessário utilizar as barras invertidas (contrabarras) e os colchetes. Só quando a procura for por um caractere único, como no exemplo (1), os colchetes podem ser desprezados. Se diversos caracteres forem anotados sem estarem entre colchetes, eles serão interpretados como uma string.

Quando a procura for por um grupo de determinados caracteres, estes são simplesmente anotados entre colchetes - como no exemplo (2).

Quando se pesquisa um determinado contexto, por exemplo a primeira metade do alfabeto ou números, marca-se o contexto desejado com um caractere inicial seguido de um sinal de menos e do caracter final, como mostram os exemplos (3) e (4).

Quando se deseja procurar um dos seguintes sinais, + - ? . * ^ $ ( ) [ ] { } | \, há a necessidade de precedê-los com uma barra invertida - como mostrado nos exemplos (7) e (8).

Existem também padrões de pesquisa especiais constituídos por uma barra invertida e uma letra chave. Os exempos (5), (6) e de (10) a (17) mostram estes padrões.

Uma procura negativa também pode ser efetuada. Para isto, utiliza-se o acento circunflexo ^ antes do caractere ou contexto desejados. Uma pesquisa deste tipo tem como resultado apenas as partes que não contenham os caracteres indicados. Os exemplos (18) e (19) mostram sua utilização.

Para procuras em mais de uma linha, a expressão regular precisa terminar com um s. Veja o exemplo (20).

Informações adicionais