<span style="font-family: courier new,monospace;">Flávio bem vindo ao clube dos que tomaram, tomam e vão tomar cacete de regex.</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">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 &#39;eq&#39; por &#39;=~ //i&#39;. Mas felizmente você está percebendo rápido que regex é um padrão muito rígido, e relativamente fácil de ser &#39;quebrado&#39;.<br>

<br>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: &quot;a regex (expressão regular) não pode ser utilizada para processar algo que não é regular&quot;, compreender esta frase é muito importante, compreender o que é &#39;regular&#39; é imprescindível.<br>

<br>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 &#39;Mastering Regular Expression&#39; e dê uma olhada no site <a href="http://www.regular-expressions.info/">http://www.regular-expressions.info/</a>.<br>

<br>Abraços e bem vindo ao clube !<br><br>Solli M. Honório<br> </span><br style="font-family: courier new,monospace;"><br><div class="gmail_quote">2010/4/25 &quot;Flávio R. Lopes&quot; <span dir="ltr">&lt;<a href="mailto:flavio.lopes@links.inf.br">flavio.lopes@links.inf.br</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


  
  

<div 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 &quot;quebrei a sequencia&quot; ao inserir
&#39;Silva&#39; 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
&quot;and&quot; seguinte de um espaço até a palavra &quot;Flintstone&quot;<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 &quot;and&quot; 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 &quot;\w+&quot;<br>
<br>
Vc pode me explicar novamente ?<br>
<br>
<br>
Gabriel Vieira escreveu:
<div><div></div><div class="h5"><blockquote type="cite">
  <pre>2010/4/25 &quot;Flávio R. Lopes&quot; <a href="mailto:flavio.lopes@links.inf.br" target="_blank">&lt;flavio.lopes@links.inf.br&gt;</a>:
  </pre>
  <blockquote type="cite">
    <pre>use 5.010;
my $names = &#39;Fred Flinstone and Wilma Flinstone&#39;;
if( $names =~ m/(?&lt;last_name&gt;\w+) and \w+ \g{last_name}/ ) {
  say &quot;I saw $+{last_name}&quot;;
  }
    </pre>
  </blockquote>
  <pre>No caso, se vc perceber na regex que você postou é identificado:

1) (?&lt;last_name&gt;\w+) -&gt; um conjunto de um ou mais caracteres
alfanuméricos (ou _) e atribuido o seu valor à variável $last_name
2) and -&gt; seguido de 1 espaço, a palavra &#39;and&#39; e mais 1 espaço
3) \w+ -&gt; seguido de mais um conjunto de caracteres alfanuméricos (ou
_), seguido de espaço
4) \g{last_name} -&gt; 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&lt;--------------
use 5.010;
my $names = &#39;Fred Flinstone and Wilma Silva Flinstone&#39;;
if( $names =~ m/(?&lt;last_name&gt;\w+) and (\w+\s+)*\g{last_name}/ ) {
  say &quot;I saw $+{last_name}&quot;;
}
--------------&gt;8--------------

Que eu já indicaria, algo que possa satisfazer 2 sobrenomes iguais.

--------------8&lt;--------------
use 5.010;
my $names = &#39;Fred Silva Flinstone and Wilma Silva Flinstone&#39;;
if( $names =~ m/(?&lt;last_name&gt;(\w+\s*)+) and (\w+\s+)*\g{last_name}/ ) {
  say &quot;I saw $+{last_name}&quot;;
}
--------------&gt;8--------------


[]s,

  </pre>
</blockquote>
<br>
</div></div></div>

<br>_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br></blockquote></div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>