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:
[^@]+@[^@.]+(\.[^@.]+)+