Pessoal (...)
Na verdade a minha dúvida eh sobre regexp...
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