[Rio-pm] range de números em regexp

Breno G. de Oliveira breno em clavis.com.br
Quinta Junho 1 21:01:59 PDT 2006


O problema é que, assim como o exemplo de um dígito, isso não escala
muito bem :/

Imagine o caso pra guardar um número qq entre 0 e 255, por exemplo. Ou
entre 1 e 1306, exceto o 42? Fica bastante complicado :/

É claro que isso é um exercício mental, e que um simples if depois de
uma ER genérica resolveria o caso, mas um módulo que encapsulasse isso
numa ER seria legal ;) Já pensou?
/(0,255)/
/(1,41)|(43,1306)/

Existe um módulo chamado Regexp::Assemble em que vc passa pra ele o que
quer verificar e ele transforma em apenas uma ER, tomando alguns
cuidados com otimização. O código que ele retornou pro range 16-34 do
desafio foi exatamente o da Mila (só que em outra ordem), então é um
sinal de que ela chegou bem perto de um resultado ótimo (ou não ;)

E ai? Mais alguém se habilita?


Marco A P D'Andrade wrote:
> Rolou na lista do cascavel, que confesso me surpreendeu um pouco (eh
> ... ja faz muito tempo que nao leio manuais ...)
> 
> Não consegui chegar a um codigo produtivo, mas ja passa da meia noite
> e o sono está forte!!
> 
> 
> 
> Abaixo uma fração do "perlre.pod" ...
> 
> 
> (?{ code })
>     WARNING: This extended regular expression feature is considered
> highly experimental, and may be changed or deleted without notice.
> 
>     This zero-width assertion evaluates any embedded Perl code. It
> always succeeds, and its code is not interpolated. Currently, the
> rules to determine where the code ends are somewhat convoluted.
> 
>     This feature can be used together with the special variable $^N to
> capture the results of submatches in variables without having to keep
> track of the number of nested parentheses. For example:
> 
>       $_ = "The brown fox jumps over the lazy dog";
>       /the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
>       print "color = $color, animal = $animal\n";
> 
> 
> Claro que o codigo da Camila atende à solicitação!
> 
> Vale ressaltar que ER é algo muito poderoso, mas existe um custo
> consideravel de processamento, e deve ser feito com criterio... ou
> seja ... não é a solução magica para tudo (é quase isso) ...
> 
> 
> 2006/6/1, Camila Mattos MK <misskaapow em gmail.com>:
> 
>>/^(1[6-9]|2\d|3[0-4])$/ ?!
>>deve ter outra maneira mais bonita de fazer, mas como eu tô meio
>>ocupada agora não dá pra pensar melhor...
>>
>>On 6/1/06, Breno G. de Oliveira <breno em clavis.com.br> wrote:
>>
>>>Pessoal,
>>>
>>>recentemente um amigo meu me apresentou o seguinte problema:
>>>
>>>"como fazer uma ER que só case se encontrar um número dentro de um
>>>intervalo/alcance/range qualquer?"
>>>
>>>Bem - disse eu -,  para fazer isso com números entre 0 e 9 é
>>>relativamente fácil. Para buscar, por exemplo, por números entre 5 e 8,
>>>poderíamos usar:
>>>
>>>/[5678]/
>>>
>>>Mas e quando queremos encontrar números com mais de um dígito?
>>>
>>>
>>>Eis, então, o problema: fazer uma ER que case SE E SOMENTE SE o valor
>>>estiver entre 16 e 34.
>>>
>>>Em Perl 6 é fácil (aí Fernando! ;P), partindo do princípio que o RFC 197
>>>foi respeitado, bastaria fazer:
>>>
>>>/(16,32)/
>>>
>>>mas e em Perl 5? Alguém se habilita?
>>>
>>>obs: não vale fazer /16|17|18|19|20|21|...|29|30|31|32/   =)
>>>
>>>
>>>[]s
>>>
>>>breno
>>>_______________________________________________
>>>Rio-pm mailing list
>>>Rio-pm em pm.org
>>>http://mail.pm.org/mailman/listinfo/rio-pm
>>>
>>
>>
>>--
>>[]s,
>>camila mattos "mk."
>>
>>"there is more than one way to do it";
>>
>>http://designerfakes.net ; porfolio
>>#392689 ; linux user
>>_______________________________________________
>>Rio-pm mailing list
>>Rio-pm em pm.org
>>http://mail.pm.org/mailman/listinfo/rio-pm
>>
> 
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
> 
> 


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