<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=iso-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Oi Gabriel!<br>
<br>
Nossa cara!...tô tomando um cacete de regex!<br>
<br>
Putz....num fica bravo, mas não entendi direito sua explicação.<br>
<br>
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"<br>
<br>
Deixa ver se te explico melhor como vejo a coisa:<br>
No passo-3 a gente tem: and [seguido de um espaço] \w+ [outro espaço]
\g{last_name}<br>
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, <br>
\w+ = [espaço]Wilma[espaço]Silva[espaço]\g{last_name}; onde
\g{last_name} = Flintstone<br>
<br>
Eu acho então que tô confundindo o "\w+"<br>
<br>
Vc pode me explicar novamente ?<br>
<br>
<br>
Gabriel Vieira escreveu:
<blockquote
cite="mid:u2i83d8367f1004251026j5bff5cf9s605e4ed04fc10327@mail.gmail.com"
type="cite">
<pre wrap="">2010/4/25 "Flávio R. Lopes" <a class="moz-txt-link-rfc2396E" href="mailto:flavio.lopes@links.inf.br"><flavio.lopes@links.inf.br></a>:
</pre>
<blockquote type="cite">
<pre wrap="">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}";
}
</pre>
</blockquote>
<pre wrap=""><!---->
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,
</pre>
</blockquote>
<br>
</body>
</html>