[Cascavel-pm] Res: Res: expressao regular

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Janeiro 29 00:40:29 PST 2008


Patty Silva wrote:
> Pessoal..estou fazendo alguns testes:
> 
> my $string = "fora1 Begin dentro1 end Begin dentro2 end Begin dentro3
>  end Begin dentro4 en d fora2";
> 
> #while($s =~ 
> m/\string?\n?(.*?)\s?(B\s?e\s?\s?g\s?i\s.*?\s?e\s?n\s?d\s?)\s?(.*?)/gis)
> 
> minha expressao pega tudo q esta dntro de Begin e End porem ele nao
> pega o fora2.. isso pq nao achou o Begin e end.. mas como eu faria
> para recupera-lo?

Patty, esta expressão regular mal consegue bater com "Begin" e "End":
repare que falta um "n" no final de "Begin", antes do ".*?" no centro da
expressão.

Eu também duvido que isto bata com alguma coisa, já que "\string?" (no
início da expressão) não consegue bater com nada nos seus dados.

Eu recomendo a você reescrever isso usando a opção "/x", que permite
introduzir espaços e comentários dentro da expressão regular.

Eu fiz isso:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $string = "fora1 Begin dentro1 end Begin dentro2 end Begin dentro3
end Begin dentro4 en d fora2";

my $spc        = qr{ \s* }x;
my $begin      = qr{ $spc [Bb] $spc [Ee] $spc [Gg] $spc [Ii] $spc [Nn]
$spc }x;
my $end        = qr{ $spc [Ee] $spc [Nn] $spc [Dd] $spc }x;
my $expression = qr{ ^ (.*?) (:? $begin (.*?) $end )+ (.*?) $spc $ }x;

print STDERR qq{Usando \n\n$expression\n\n para buscar dados\n};

my @data = $string =~ m{ $expression }gis;

print Dumper( \@data ), $/;
__END__

E a expressão regular que eu construo dinamicamente (para facilitar a
leitura) é:

(?x-ism: ^ (.*?) (:? (?x-ism: (?x-ism: \s* ) [Bb] (?x-ism: \s* ) [Ee]
(?x-ism: \s* ) [Gg] (?x-ism: \s* ) [Ii] (?x-ism: \s* ) [Nn] (?x-ism: \s*
) ) (.*?) (?x-ism: (?x-ism: \s* ) [Ee] (?x-ism: \s* ) [Nn] (?x-ism: \s*
) [Dd] (?x-ism: \s* ) ) )+ (.*?) (?x-ism: \s* ) $ )

Mas isso ainda não resolve o teu problema: a minha expressão regular
também não funciona.

Eu não tenho tempo para demonstrar isso agora, mas acho que a linguagem
que você está usando não é regular. Você poderia transformar isso numa
linguagem regular, acrescentando "begin" no início (se não houver) e
"end" no final (se não houver), antes de começar.

Putamplexos!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}



Mais detalhes sobre a lista de discussão Cascavel-pm