Extrair string dentro de colchetes aninhados

Preciso extrair seqüências de caracteres de colchetes aninhados da seguinte maneira:

[ this is [ hello [ who ] [what ] from the other side ] slim shady ]

Resultado(A ordem não importa):

This is slim shady
Hello from the other side
Who 
What

Observe que a sequência pode ter N colchetes e sempre será válida, mas pode ou não ser aninhada. Além disso, a string não precisa começar com um colchete.

As soluções que encontrei on-line para um problema semelhante sugerem uma regex, mas não tenho certeza de que funcione nesse caso.

Eu estava pensando em implementar isso semelhante à forma como verificamos se uma string tem todos os parênteses válidos:

Caminhe pela corda. Se vemos um [empurramos seu índice na pilha, se vemos um], fazemos a substring de lá para o ponto atual.

No entanto, precisaríamos apagar essa substring da string original, para não obtê-la como parte de nenhuma das saídas. Então, ao invés de empurrar apenas empurrando o índice para a pilha, eu estava pensando em criar uma LinkedList à medida que avançamos, e quando encontramos um [nós inserimos esse Node na LinkedList. Isso nos permitirá excluir facilmente a substring do LinkedList.

Essa seria uma boa abordagem ou existe uma solução mais limpa e conhecida?

EDITAR:

'[ this is [ hello [ who ] [what ] from the other [side] ] slim shady ][oh my [g[a[w[d]]]]]'

Deve retornar(A ordem não importa):

this is slim shady
hello from the other
who 
what 
side
oh my
g
a
w
d

Espaços em branco não importam, é trivial removê-los posteriormente. O que importa é ser capaz de distinguir os diferentes conteúdos entre colchetes. Separando-os em novas linhas ou com uma lista de cadeias.

questionAnswers(4)

yourAnswerToTheQuestion