Dúvida Questão do Livro 1.6 (Regex) [RESOLVIDO]

Galera, eu não entendi essa questão do Livro:

import java.util.regex.*;


class Regex2 {

         public static void main(String[] args) {

                 Pattern p = Pattern.compile("\d*");
                 Matcher m = p.matcher("ab34ef");
                 boolean b = false;

                 while(b = m.find()) {
                           System.out.print(m.start() + m.group());
                 }

         }

}

Resposta: 01234456

Primeiro, a String tem 6 posições, então deveria imprimir de 0 a 5. Mas imprime de 0 a 6.
Se eu coloco apenas “a” na String, imprime 0 a 1. Por que?

Segundo, não imprime o número 3 referente a posição 3. Imprime 3 a 4 referente aos digítos da String. Por que?

Bom dia!

Ele não imprime a posição três porque ele “casa” o ‘3’ e o ‘4’ na mesma expressão regular. então ele pula uma posição.

agora tua outra questão vou ficar devendo =(

abraços

Modifiquei seu programa para ficar mais fácil de entender.

import java.util.regex.*;  
class Regex2 {  
    public static void main(String[] args) {  
        Pattern p = Pattern.compile("\\d*");  
        Matcher m = p.matcher("ab34ef");  
        while(m.find()) {  
            System.out.println("pos [" + m.start() + "] ==> str [" + m.group() + "]");  
        }  
    }             
}

A saída desse programa, que é equivalente ao seu exceto que é muito mais fácil de entender, foi:

pos [0] ==> str []
pos [1] ==> str []
pos [2] ==> str [34]
pos [4] ==> str []
pos [5] ==> str []
pos [6] ==> str []

a) Na verdade, não é porque a string tem 6 posições que ele tem de imprmir de 0 a 6. Na verdade, ele executa um “find” e retorna a expressão que bateu com esse find, e a seguir passa para a próxima posição. No seu caso, ele está tentando bater com a expressão “\d*”, que quer dizer: “uma expressão regular que bate com uma string contendo zero ou mais dígitos”. Você viu que na maior parte das vezes, ele bateu com uma string contendo zero dígitos (ou seja, uma string vazia).
b) Note que ele está imprimindo a posição (e não um número sequencial). Quando ele estava na posição 2 (start = 2), bateu com a expressão “34” (ou seja, uma string contendo 0 ou mais dígitos). Quando ele fez isso, a próxima posição a ser examinada é a posição 4, não a posição 3.

Entendi galera.
Muito obrigado pela explicação entanglement =))
Ficou bem claro agora