Para manipular a ordem das partes da string, uma das abordagens é capturar primeiro a string inteira com todas as respectivas partes.
Vamos ver a imagem abaixo. Cada parte da string é mapeada para um grupo numerado. Existem 6 deles neste exemplo. Ter todas as partes capturadas como grupos permite controlar com precisão a seção de substituição.
No código VS, ficaria assim:
Localizar: (##)(\s+)(\[)(\])(\(.*?\))(Heading)
Substitua: $1$2$3$6$4$5
INPUT
## [](https://www.website.com/)Heading
OUTPUT
## [Heading](https://www.website.com/)
Vamos tentar algo mais geral:
Localizar: (##)(\s+)(\[)(\])(\(.*?\))([^^]+)
Substitua: $1$2$3$6$4$5
INPUT
## [](https://www.website.com/)Heading
e ## [](https://www.website2.com/)Heading2
e ## [](https://www.website3.com/)Heading3
OUTPUT
## [Heading](https://www.website.com/)
e ## [Heading2](https://www.website2.com/)
e ## [Heading3](https://www.website3.com/)