[SP-pm] Capturando Uma Quantidade Arbitrária de Valores Com Uma Expressão Regular - Sugestões?
Marcel
webknowledge em gmail.com
Segunda Março 24 18:06:29 PDT 2008
perl -MData::Dumper -e
'$string="chave1:valor1\nbla\nble\nbli\nchave2:valor2\nblo\nblu\nchave3:
valor3\nbly\n"; @list = $string =~
m{(?:^([\S+]+):\s*((?:(?:[^\n]+|[\t]*))))|(?:^([\S+]+))}xmg; print Dumper
\@list';
$VAR1 = [
'chave1',
'valor1',
undef,
undef,
undef,
'bla',
undef,
undef,
'ble',
undef,
undef,
'bli',
'chave2',
'valor2',
undef,
undef,
undef,
'blo',
undef,
undef,
'blu',
'chave3',
'valor3',
undef,
undef,
undef,
'bly'
];
Ou seja, pra cada linha a expressão espera 3 valores para comparar. Caso não
encontre alguma, devolve undef.
2008/3/24 Marcel <webknowledge em gmail.com>:
> Eu tb tentei de todo jeito descobrir uma única regexp para realizar a
> tarefa. Mas só consegui retornar o que o breno conseguiu retornar. Um undef
> pra cada non-matched.
>
> 2008/3/20 breno <breno em rio.pm.org>:
>
> Oi Champs,
> >
> > Desculpe se estou falando besteira, mas o seu $key_value (qr{ $key
> > $value $continuation }x ) está procurando diretamente por chave:valor
> > E pela continuação (o +cap...) na mesma linha (o modificador "m" vc só
> > passa no match do $key_value, e não antes). Não olhei com calma mas só
> > de mudar para ( qr{ $key $value | $continuation }x ) obtive
> >
> > $VAR1 = [
> > 'key',
> > 'value1',
> > undef,
> > undef,
> > undef,
> > 'cap3',
> > undef,
> > undef,
> > 'cap4',
> > undef,
> > undef,
> > 'cap5',
> > undef,
> > undef,
> > undef,
> > 'key',
> > 'value2',
> > undef,
> > undef,
> > undef,
> > undef,
> > undef,
> > undef,
> > undef
> > ];
> >
> > que fora os undef's, é o que vc quer. Mas olhando a estrutura não acho
> > que seja o que vc quer (embora não tenha entendido ainda o propósito
> > :-), e sim um "my $continuation = qr{ (?: \n \+ $value )* }mx;" (e
> > não "?}x" ) - mantendo o $key $value $continuation sem "or". O
> > problema é que isso devolve
> >
> > $VAR1 = [
> > 'key',
> > 'value1',
> > 'cap5',
> > 'key',
> > 'value2',
> > undef
> > ];
> >
> > Que é só uma variação inútil do que vc já tinha. Enfim, são só
> > ramblings feitos em 5 minutos, e sou péssimo em expressões regulares.
> > Mas com sorte te dei algumas idéias para atacar o problema ou sei lá.
> >
> > []s
> >
> > -b
> >
> >
> > 2008/3/20 Luis Motta Campos <luismottacampos em yahoo.co.uk>:
> > > Gente,
> > >
> > > Eu estou tentando capturar uma quantidade arbitrária de valores
> > usando
> > > uma expressão regular, mas estou com problemas. O meu código é este
> > aqui:
> > >
> > > #!/usr/bin/perl
> > > use strict;
> > > use warnings;
> > >
> > > my $string = <<EOT;
> > > key: value1
> > > +cap3
> > > +cap4
> > > +cap5
> > > key:value2
> > > EOT
> > >
> > > my $key_value = do {
> > > my $key = qr{ ^ ( [a-zA-Z]+ ) : }x;
> > > my $empty_value = qr{ [ \t]* }x;
> > > my $free_form_str = qr{ [^\n]+ }x;
> > > my $value = qr{ \s* ( (?: $free_form_str | $empty_value ) ) }x;
> > > my $continuation = qr{ (?: \n \+ $value )? }x;
> > > qr{ $key $value $continuation }x;
> > > };
> > >
> > > print $key_value, $/;
> > >
> > > use Data::Dumper;
> > > my @list = $string =~ m{ $key_value }xmg;
> > > print Dumper \@list;
> > > __END__
> > >
> > > O resultado que eu tenho de rodar isso é
> > >
> > > $VAR1 = [
> > > 'key',
> > > 'value1',
> > > 'cap3',
> > > 'key',
> > > 'value2',
> > > undef
> > > ];
> > >
> > > Mas o resultado que eu quero é
> > >
> > > $VAR1 = [
> > > 'key',
> > > 'value1',
> > > 'cap3',
> > > 'cap4',
> > > 'cap5',
> > > 'key',
> > > 'value2',
> > > undef
> > > ];
> > >
> > > Podem haver uma quantidade arbitrária, não-determinada,
> > não-previamente
> > > declarada de valores "+cap#" (onde "#" é um inteiro positivo).
> > >
> > > Vocês por acaso não tem uma sugestão de como eu poderia implementar
> > isso?
> > >
> > > Meu Perl é o 5.8.8, apenas para constar.
> > >
> > > Obrigado a todo mundo com antecedência.
> > > Putamplexos!
> > > --
> > > Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
> > > Perl fanatic evangelist, and amateur {cook, photographer}
> > >
> > > _______________________________________________
> > > SaoPaulo-pm mailing list
> > > SaoPaulo-pm em pm.org
> > > http://mail.pm.org/mailman/listinfo/saopaulo-pm
> > >
> > _______________________________________________
> > SaoPaulo-pm mailing list
> > SaoPaulo-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/saopaulo-pm
> >
>
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080324/50b1b00b/attachment-0001.html
Mais detalhes sobre a lista de discussão SaoPaulo-pm