[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Ajuda com filtro para popsneaker - regexp



Contam os Historiadores que "Leandro Ferreira" em "10-05-2004 20:10" escreveu a seguinte mensagem:
Pessoal

(...)

  
Na verdade a minha dúvida eh sobre regexp...


  

Aih eu posso de ajudar, segua aih um quick-help sobre RE. Sempre uso ele para momtar as RES. Agora se você quiser saber sobre conceito. Dá umas "GOOGLADAS" que vc acha muita coisa sobre R.E. principal em PERL.

Espero ter ajudado.


Expressões regulares

Aqui estão alguns caracteres especiais ER e seus significados:
. # qualquer caractere exceto newline
^ # o início da linha ou do caractere
$ # o fim da linha ou do caractere
* # nenhum, um ou mais do último caractere
+ # um ou mais do último caractere
? # nenhum ou o último caractere

E aqui alguns exemplos de comparações. Recorde que seu uso é sempre entre barras.

p.r
#
p seguido por qualquer caractere seguido por e isto irá comparar:
#
par
# para
# por

^f
f# no início da linha

^ftp
#
ftp no início da linha

es$
# es no final da linha

und*
# un seguido por nenhum ou vários caracteres d
# isto irá comparar:
# un
# und
# undd
# unddd (etc)

.*
# qualquer string sem o newline,
# isto ocorre porque o . compara qualquer caractere
# e o * é o mesmo que nenhum ou mais deste caractere

^$
# uma linha vazia

Existem ainda mais opções. Colchetes podem ser usados para comparar qualquer um destes caracteres dentro deles. Entre colchetes, o símbolo - indica entre e o símbolo ^ no início significa não:

[qjk] # tanto q ou j ou k
[^qjk] # exceto q, j e k
[a-z] # qualquer um entre a e z, inclusive estes
[^a-z] # exceto letras minúsculas
[a-zA-Z] # qualquer letra
[a-z]+ # qualquer sequência com pelo menos uma ou mais letras minúsculas

As demais opções servem mais para referência.

Uma barra vertical | representa ou e os parênteses podem ser usados para agrupar caracteres:

geléia|creme # tanto geléia ou creme
(ov|dad)os # tanto ovos ou dados
(da)+ # tanto da ou dada ou dadada

Aqui estão mais alguns caracteres especiais:

\n # um newline
\t # um tab
\w # qualquer caractere alfanumérico (palavra) o mesmo que [a-zA-Z0-9_]
\W # exceto caracteres alfanuméricos, o mesmo que [^a-zA-Z0-9_]
\d # qualquer dígito o mesmo que [0-9]
\D # exceto dígitos, [^0-9]
\s # qualquer caractere em branco: espaço, tab, newline, etc
\S # exceto caracteres em branco
\b # uma palavra limitada, fora de []
\B # nenhuma palavra limitada

Está claro que caracteres como $, |, [, ), \, / são casos particulares em expressões regulares. Se você quiser comparar um ou mais destes caracteres, então deve sempre precedê-los de uma barra invertida:

\| # barra vertical
\[ # colchetes esquerdo
\) # parênteses direito\* # asterisco
\^ # circunflexo]
\/ # uma barra
\\ # barra invertida


Alguns exemplos de ERs

Como foi mencionado antes, o uso de expressões regulares deve ocorrer aos poucos. Aqui estão alguns exemplos. Lembre-se sempre de usá-los entre barras /.../

[01] # tanto "0" ou "1"
\/0 # divisão por zero
\/ 0 # divisão por zero com um espaço
\/\s0 # divisão por zero com um espaço em branco "/ 0" onde o espaço pode ser um tab, por exemplo
\/ *0 # divisão por zero com nenhum ou alguns espaços "/0" ou "/ 0" ou "/ 0" etc

\/\s+0 # divisão por zero com alguns espaços em branco

\/\s+0\.0* # como o anterior, mas com ponto decimal e alguns zeros depois dele, ou # não "/ 0." ou "/ 0.0" ou "/ 0.000" etc
# observe a barra invertida antes do ponto



Substituição e tradução

Uma vez identificadas as expressões regulares, Perl permite fazer substituições baseadas naquelas comparações.

O modo de fazer isso é usando a função s que é parecida com o modo de substituição usado pelo editor de texto vi do Unix.

Mais uma vez o operador de comparação é usado, e mais uma vez se ele for omitido então a substituição utilizará a variável $_ em seu lugar.

Para substituir uma ocorrência de londres por Londres na $sentença devemos usar a expressão:

$sentenca =~ s/londres/Londres/ e para fazer o mesmo com a variável $_ use:

s/londres/Londres/

Note que as duas expressões regulares estão usando um total de três barras. O resultado desta expressão é o número de substituições feitas, de modo que pode ser tanto zero (falso) como um (verdadeiro), no caso acima.

Opções

Este exemplo somente substitui a primeira ocorrência da string, mas pode ser que tenha mais do que uma string que desejamos substituir.



Para fazer uma substituição global, a última barra deve ser seguida por um g: s/londres/Londres/g que obviamente utiliza a variável $_. Novamente a expressão retorna o número de substituições realizadas, que é zero ou alguma coisa maior que zero (verdadeiro).

Se desejarmos também substituir ocorrências de lOndres, lonDRES, LoNDrES e assim por diante, então podemos usar: s/[Ll][Oo][Nn][Dd][Rr][Ee][Ss]/Londres/g mas um modo mais fácil é usar a opção i (para ignorar letras maiúsculas ou minúsculas). A expressão: s/londres/Londres/gi fará uma substituição global não importando se foi usado letras maiúsculas ou minúsculas. A opção i também pode ser usada em expressões regulares básicas.



Recordando modelos

É frequentemente útil recordar modelos que tem sido comparados de modo que eles possam ser usados novamente. Isto ocorre porque qualquer coisa comparada entre parênteses retorna nas variáveis $1,...,$9. Estas strings também podem ser usadas da mesma forma que nas expressões regulares (ou substituições) utilizando os códigos especiais ER \1,...,\9.

Esse teste:

$_ = "Lorde Whopper de Fibbing";

s/([A-Z])/:\1:/g;

print "$_\n";

colocará cada letra maiúscula entre : (dois pontos). Neste exemplo, mostrará :L:orde :W:hopper de :F:ibbing. As variáveis $1,...,$9 são somente de leitura, você não pode alterá-las.



Como outro exemplo, o teste:

if (/(\b.+\b) \1/)

{

print "Encontrou $1 repetida\n";

}

irá identificar qualquer palavra repetida. Cada \b representa uma palavra limitada e .+ compara qualquer string não vazia, então \b.+\b compara qualquer coisa entre duas palavras limitadas.

O resultado é então armazenado como \1 para expressões regulares e como $1 para o resto do programa.

Se $_ for igual a "teste teste teste2 teste2", a mensagem será mostrada, mas somente com a primeira ocorrência.



O seguinte exemplo troca o primeiro e último caracteres da linha na variável $_:

s/^(.)(.*)(.)$/\3\2\1/

O ^ e o $ comparam o início e o fim da linha. O código \1 armazena o primeiro caractere, o \2 armazena cada string entre os dois e o último caractere é armazenado no código \3. Então aquela linha é substituída com a troca entre \1 e \3.

Após uma comparação, você pode usar variáveis especiais somente de leitura $` ou $& ou $' para encontrar o que foi comparado antes, durante e depois da busca. Então:

$_ = "Lorde Whopper de Fibbing";

/pp/;

resultará em verdadeiro nas seguintes declarações (recorde que eq é um teste usado em strings):

$` eq "Lorde Who";

$& eq "pp";

$' eq "er de Fibbing";

Finalmente, sobre o tópico Recordando modelos, o importante é saber que dentro de barras de uma comparação ou substituição, as variáveis são interpoladas. Então:

$busca = "par";

s/$busca/xxx/g;

irá substituir cada ocorrência com xxx. Se você quiser substituir cada ocorrência de para então você não pode usar s/$buscaa/xxx/g porque o a será interpolado com a variável $busca. Ao invés disso, você deve colocar o nome da variável entre chaves, de modo que o código seja:

$busca = "par";

s/${busca}a/xxx/g;



Tradução

A função tr permite a tradução caractere-a-caractere. A seguinte expressão substitui cada a com e, cada b com d, cada c com f na variável $sentença. A expressão retorna o número de substituições efetuadas:

$sentenca =~ tr/abc/edf/

A maioria dos códigos especiais ER não se aplica à função tr. Por exemplo, a próxima declaração conta o número de asteriscos na variável $sentença e armazena na variável $contagem:

$contagem = ($sentenca =~ tr/*/*/);
Contudo, o traço permanece como seu uso entre. Esta declaração converte toda $_ para letra maiúscula:

tr/a-z/A-Z/;





um abraço

Leandro

  


--

  .~.   
 / O \  Gustavo Moda
(|   |) Linux User #341912
'\   /` 
  ^`^   *--- *---- *---- *---- *---- *---- *---- *---- *----  


"Gaste mais horas realizando que sonhando, fazendo que planejando, vivendo que esperando, porque embora quem quase morre esteja vivo, quem quase vive já morreu"
Luiz Fernando Veríssimo


Reply to: