Matcher não encontrando palavras sobrepostas?

Estou tentando pegar uma string:

String s = "This is a String!";

E retorne todos os pares de duas palavras dentro dessa string. Nomeadamente:

{"this is", "is a", "a String"}

Mas agora, tudo o que posso fazer é retornar:

{"this is", "a String"}

Como eu posso definir o meu loop while de tal forma que eu possa explicar essa falta de palavras sobrepostas? Meu código é o seguinte: (Realmente, eu ficaria feliz com isso apenas retornando um int representando quantos subconjuntos de strings ele encontrou ...)

int count = 0;
while(matcher.find()) {
    count += 1;
}

Obrigado a todos.

questionAnswers(4)

yourAnswerToTheQuestion