[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