[Cascavel-pm] Atenção com negações em regexen (era: Help me (sem filosofia em Cristo))

Wendel Scardua wendelscardua em gmail.com
Quinta Fevereiro 1 12:12:40 PST 2007


Eu já vi esse tipo de erro acontecer inúmeras vezes (aliás, enquanto
escrevia este email enxerguei outro problema, vou mencioná-lo depois) :

1. A pessoa quer pegar algo entre aspas, e usa a regexp: /"(.*?)"/

2. Daí a pessoa quer dizer que dentro das aspas não pode ter a palavra "all"

3. Então, a pessoa escreve: /"([^(all)]*?)"/

4. E como isso de fato não bate com "all", a pessoa fica feliz.

Eis o erro:  [aeiou] bate com qualquer caractere dentre a, e, i, o, ou u.
[^aeiou] bate com qualquer caractere, exceto a, e, i, o, e u.

[^(all)] é igual a [^()al] : qualquer caractere, exceto (, ), a, ou l

Para negar a presença de uma seqüência inteira, pode-se usar um "negative
lookahead":

/"(?!all")(.*?)"/

Onde (?!all) indica que, a partir daquele ponto não pode bater com all".

Ah sim, e agora o outro problema que me lembrei acima:

Gabriel escreveu "(.+?)".

No exemplo abaixo:
<option value=""></option><option value="foo"></option>

a regexp vai capturar em $1: "></option><option value=.

<option value=""></option><option value="foo"></option>



On 2/1/07, Gabriel Vieira <gabriel.vieira em gmail.com> wrote:
>
> $teste = "<option value=\"all\">oi</option><option
> value=\"\">ola</option><option value=\":D\">opa</option>";
> print "$1\n" while $teste =~ /value="([^(all)]+?)"/ig;
>
> aqui funcionou :P
>


-- 
[]s
Wendel

"Não ajustar o auto-ajuste" - http://wendel.scardua.net/
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070201/c520e132/attachment.html 


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