¿Matcher no encuentra palabras superpuestas?

Estoy tratando de tomar una cuerda:

String s = "This is a String!";

Y devuelve todos los pares de 2 palabras dentro de esa cadena. A saber:

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

Pero en este momento, todo lo que puedo hacer es regresar:

{"this is", "a String"}

¿Cómo puedo definir mi bucle while de modo que pueda explicar esta falta de palabras superpuestas? Mi código es el siguiente: (Realmente, estaría contento con solo devolver un int que representa la cantidad de subconjuntos de cadenas que encontró ...)

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

Gracias a todos.