[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