Java: Compreendendo o método String replaceAll ()

Estou procurando descobrir a resposta para este problema aqui.

Primeiramente,

blah[abc] = blah[abc].replaceAll("(.*) (.*)", "$2, $1");

Alguém pode me explicar o que são (. *), $ 2 e $ 1?

Em segundo lugar, quando aninho isso em uma instrução for para reverter duas partes de uma sequência, sou atingido com um erro de exceção. Fiquei me perguntando se alguém sabia por que isso é.

obrigado

Edit: Este é o erro que recebo

Exceção no encadeamento "main" java.lang.ArrayIndexOutOfBoundsException: 1 em ChangeNames.main (ChangeNames.java:21)

questionAnswers(2)

yourAnswerToTheQuestion