Qual idioma você está usando?
Em geral, parece que você quer algo que corresponda aos aspectos básicos de um domínio, excluindo a possibilidade de um período diferente daquele que delineia o arquivo .tld.
# link ^.] + \. (com | net | org) #i
Se você não quer combinar o protocal, talvez algo assim.
# [^. ] + \. (com | net | org) #i
O seu desejo de lidar com TLDs com várias partes vai estragar tudo, você precisará manter uma lista manual de todas as que deseja combinar. A única alternativa é fazer pesquisas de DNS para determinar o tipo de listagem. Realmente não existe outra maneira de extrair dados de subdomínio do domínio com uma expressão regular, porque, por direitos, os domínios são, na verdade, apenas subdomínios de algum TLD (domínio de nível superior).
Editar: Para combinar os TLDs, considerando que eles têm menos de quatro caracteres, você pode brincar com algo assim. Você vai ter que descobrir o que constitui o início e o fim de uma partida. Você está exigindo a presença de um protocal? Isso está em um parágrafo em que alguém poderia digitar um período fora de contexto? Se você der mais detalhes sobre os parâmetros, poderemos fornecer uma solução mais precisa.
[^.]+((\.[^.]{0,3})+)