[SP-pm] Expressões Regulares

Solli Honorio shonorio at gmail.com
Mon Apr 26 02:36:29 PDT 2010


Flávio bem vindo ao clube dos que tomaram, tomam e vão tomar cacete de
regex.

Neste momento você está passando pela fase 1 na escala de desenvolvedores
Perl, que é quando você começa aprender regex e acha que tudo poderá ser
feito em regex, inclusive querendo substituir 'eq' por '=~ //i'. Mas
felizmente você está percebendo rápido que regex é um padrão muito rígido, e
relativamente fácil de ser 'quebrado'.

Dois exemplos simples de como quebrar regex é tentar utilizá-la para
verificar email e ou fazer parse de html. Como o Eden já disse uma vez: "a
regex (expressão regular) não pode ser utilizada para processar algo que não
é regular", compreender esta frase é muito importante, compreender o que é
'regular' é imprescindível.

O Gabriel e o Mantovani já lhe deram boas orientações, e aqui só quero
complementar. Continue lendo o material que você está lendo, considere obter
o 'Mastering Regular Expression' e dê uma olhada no site
http://www.regular-expressions.info/.

Abraços e bem vindo ao clube !

Solli M. Honório


2010/4/25 "Flávio R. Lopes" <flavio.lopes em links.inf.br>

>  Oi Gabriel!
>
> Nossa cara!...tô tomando um cacete de regex!
>
> Putz....num fica bravo, mas não entendi direito sua explicação.
>
> Na parte em que vc se diz que eu "quebrei a sequencia" ao inserir 'Silva'
> não estaria mantendo o mesmo padrão, ou seja, o proximo \w+ (do passo 3)
> ainda não estaria no mesmo padrão? pois ainda assim teríamos o "and"
> seguinte de um espaço até a palavra "Flintstone"
>
> Deixa ver se te explico melhor como vejo a coisa:
> No passo-3 a gente tem:  and [seguido de um espaço] \w+ [outro espaço]
> \g{last_name}
> Neste \w+ não estaria compreendido TODOS os caracteres que vão do espaço
> após o "and" até o espaço last_name, ou seja,
> \w+ = [espaço]Wilma[espaço]Silva[espaço]\g{last_name}; onde \g{last_name} =
> Flintstone
>
> Eu acho então que tô confundindo o "\w+"
>
> Vc pode me explicar novamente ?
>
>
> Gabriel Vieira escreveu:
>
> 2010/4/25 "Flávio R. Lopes" <flavio.lopes em links.inf.br> <flavio.lopes em links.inf.br>:
>
>
>  use 5.010;
> my $names = 'Fred Flinstone and Wilma Flinstone';
> if( $names =~ m/(?<last_name>\w+) and \w+ \g{last_name}/ ) {
>   say "I saw $+{last_name}";
>   }
>
>
>  No caso, se vc perceber na regex que você postou é identificado:
>
> 1) (?<last_name>\w+) -> um conjunto de um ou mais caracteres
> alfanuméricos (ou _) e atribuido o seu valor à variável $last_name
> 2) and -> seguido de 1 espaço, a palavra 'and' e mais 1 espaço
> 3) \w+ -> seguido de mais um conjunto de caracteres alfanuméricos (ou
> _), seguido de espaço
> 4) \g{last_name} -> seguido posteriormente pelo mesmo conteúdo
> atribuido à variável anteriormente.
>
> O que ocorre, é que quando você adiciona Silva, você quebra essa
> sequência, já que após o conjunto de caracteres encontrado no passo 3,
> você terá outro conjunto de caracteres (Silva), ao invés de Flinstone,
> novamente, como encontrado no passo 1.
>
> Para satisfazer, diremos que podem ser encontrados 0 ou mais conjuntos
> de caracteres, antes do padrão encontrado no passo 1 se repita.
>
> --------------8<--------------
> use 5.010;
> my $names = 'Fred Flinstone and Wilma Silva Flinstone';
> if( $names =~ m/(?<last_name>\w+) and (\w+\s+)*\g{last_name}/ ) {
>   say "I saw $+{last_name}";
> }
> -------------->8--------------
>
> Que eu já indicaria, algo que possa satisfazer 2 sobrenomes iguais.
>
> --------------8<--------------
> use 5.010;
> my $names = 'Fred Silva Flinstone and Wilma Silva Flinstone';
> if( $names =~ m/(?<last_name>(\w+\s*)+) and (\w+\s+)*\g{last_name}/ ) {
>   say "I saw $+{last_name}";
> }
> -------------->8--------------
>
>
> []s,
>
>
>
>
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>



-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20100426/e700468d/attachment.html>


More information about the SaoPaulo-pm mailing list