[SP-pm] Expressões Regulares

Gabriel Vieira gabriel.vieira at gmail.com
Sun Apr 25 10:26:18 PDT 2010


2010/4/25 "Flávio R. Lopes" <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,

-- 
Gabriel Vieira


More information about the SaoPaulo-pm mailing list