Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Grupos da regex do exercício

Com a regex:

^([\w-]\.?)+@([\w-]+\.)+([A-Za-z]{2,4})+$

E o target:

donkey.kong@kart.com.br

Os grupos retornados são os seguintes:

donkey.konb@kart.com.br ||| g ||| com. ||| br

Eu não entendi porque esse segundo grupo é a letra 'g'. Eu estava esperando o trecho donkey.kong. Alguem poderia explicar? Obrigado.

7 respostas

Olá, Alexandre.

Acabei de rodar sua regex no site: https://regex101.com/

E não apareceu esse grupo g. o Resultado foi:

donkey.konb@kart.com.br
b
com.
br

Como você está testando suas regex?

cara, esses \. que ta fazendo isso

solução!

Alexandre, o problema é que seu primeiro grupo busca por UM ÚNICO \w antes de um ponto opcional (ocorrendo 1-n vezes) seguido por um @. A seleção do grupo é somente na última ocorrência, então acontece mais ou menos o seguinte:

FRASE (parcial): donkey.kong@.....

REGEX (parcial): ^([\w-.]\.?)+@

TRADUÇÃO: Um grupo (ocorrendo 1-n vezes) composto por uma word (a-zA-Z0-9_)
  ou hifen (-) seguida por um ponto opcional (\.). Este grupo é seguido de um @

PASSOS:
1. d -> match (word ou hifen, ponto opcional inexistente), marca como grupo 1
2. o -> match, marca como grupo 1 (substitui d)
3. n -> ...
...
10. g -> match, marca como grupo 1 (substitui n)
11. @ -> match arroba, para de conferir grupo 1 e segue
  em frente com o resto da regex

Repare que cada vez que dá match no conteúdo do grupo 1, ele substitui o conteudo do agrupamento.

Uma alternativa melhor seria algo como:

^(\w[\w-.]*)@.......

Em breve edito a resposta pra explicar melhor o motivo.

-- Edit

Essa regex acima captura um grupo contendo: uma word (\w) seguida por 0-n words, hifens ou pontos. O grupo para no primeiro caractere @.

Porém, expressões regulares pra captura de email são uma discussão milenar, pois a cada dia mais caracteres são aceitos na parte do endereço, e há quem diga que a melhor regex pra isso seria algo do tipo:

[^@]+@[^@.]+(\.[^@.]+)+

o erro esta em seu .

É como o Marcos Salles disse: "Um grupo de captura repetido, apenas captura a última iteração. Coloque um grupo de captura em torno do grupo repetido para capturar todas as iterações ou use um grupo que não seja de captura, em vez disso, se você não estiver interessado nos dados" . Foi o que você fez no começo: ([\w-]\.?)+ veja você está repetindo o grupo de captura por isso o g acabou ficando como selecionado, pois foi o último capturado....

Você pode mudar para: ([\w-.]+) isso faria selecionar o donkey.kong .... você não precisa dizer que o ponto "\." é opcional é só listar ele se for encontrado na target ele casa.

Espero não ter confundido mais. É isso aí. Abraço

Obrigado Marco Salles. Acabei marcando quem solucionou erradamente e não da pra corrigir.

Sou moderador então consigo corrigir. Alterei a marcação de solução por você.

Obrigado! Estou sempre por aí buscando tópicos que saiba responder com boa qualidade.

Bons estudos!