Vou tentar responder de novo, porque não sei se a resposta do ivandasilva foi mt clara…
Essa expressão regular procura por ZERO ou MAIS digitos.
Sendo assim, todas as posições da String vão atender essa condição (as letras atendem por terem ZERO digitos).
(Considere o “|” como a posição do matcher.start())
Deste modo, ele chega na posição ab34e|f que é igual a 5, e o matcher.group = “” (vazio), então é impresso o 5.
Após essa posição, ele chega na posição ab34ef| que é igual a 6 e o matcher.group = “” (vazio), então é impresso 6.
O que acontece é que após o F ainda tem ZERO digitos, então ele atende a expressão regular.
Não sei se consegui ser muito claro, se alguem puder esclarecer melhor…