Essa regex reconhece a porta, como :8080, na URL?
Não. A classe de host `[\w.-]+` não inclui `:`, então assim que o padrão encontra o dois-pontos da porta, ele para de capturar ali mesmo. `https://example.com:8080/path` casa só como `https://example.com`, sem porta e sem caminho.
A regex captura o fragmento (a âncora depois do #) da URL?
Não. A classe de caminho aceita `?`, `%`, `&` e `=`, mas não `#`, então tudo depois do símbolo de fragmento fica fora do resultado, mesmo quando query e caminho antes dele casam normalmente.
Por que usar new URL() em vez dessa regex para processar uma URL?
`new URL()` separa a string em `protocol`, `hostname`, `port`, `pathname`, `search` e `hash` já prontos para uso, entende porta e fragmento nativamente e lança erro em URL inválida. Esta regex serve para achar uma URL solta num texto, não para desmontá-la com segurança.