Java: Comprender el método String replaceAll ()

Estoy buscando averiguar la respuesta a este problema aquí.

Antes que nada

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

¿Puede alguien explicarme qué son (. *), $ 2 y $ 1?

En segundo lugar, cuando anido eso dentro de una instrucción for para invertir dos partes de una cadena, recibo un error de excepción. Me preguntaba si alguien sabía por qué es eso.

Gracia

Edit: este es el error que recibo

Exception en el hilo "main" java.lang.ArrayIndexOutOfBoundsException: 1 en ChangeNames.main (ChangeNames.java:21)

Respuestas a la pregunta(2)

Su respuesta a la pregunta