Dúvida com expressão regular

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RexSmall {
public static void main(String[] args) {
Pattern p = Pattern.compile("\d*");
Matcher m = p.matcher(“a12c3e456f”);
boolean b = false;
while(b = m.find()) {
System.out.println(m.start() + " ");
}
}
}

Porque Pattern p = Pattern.compile("\d*"); está gerando 3 4 5 6 9 10 ao inves de 0 1 3 4 5 6 9 1 0

Porque Pattern p = Pattern.compile("\d?"); está gerando 5 6 7 8 9 10

Preciso que alguém responda com certeza e não EU ACHO, preciso disto pois cai na prova de certificacao

start não é a expressão regular que bateu, e sim o índice na string.

Você confundiu “start” com “group” (sem parâmetros).

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RexSmall {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d?");
        Matcher m = p.matcher("a12c3e456f");
        while(m.find()) {
            System.out.println("[" + m.group() + "] ");
        }
    }
}

Atenção = “\d*” gera [] [1] [2] [] [3] [] [4] [5] [6] [] []
e “\d?” gera [] [12] [] [3] [] [456] [] []

Eu não confundir nada, perguntei sobre o start() que esta imprimindo o que eu escreve, e não entendi pq, testa que vc vai veh o resultado, não estou envolvendo gruop(), MINHA PERGUNTA EH SOBRE START()

Obrigado

Ok, vamos então imprimir os valores de start. Mas ainda não entendi como é que você chegou aos tais valores. Testei o programa abaixo (que dispensa a variável booleana “b” que você está usando, não sei para quê), e o programa deu alguns (mas não todos) os resultados semelhantes ao que você espera, não os que você disse que ele dá.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RexSmall {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d?");
        Matcher m = p.matcher("a12c3e456f");
        while(m.find()) {
            System.out.println("start=" + m.start() + ", end=" + m.end() + ", group=[" + m.group() + "] ");
        }
    }
}

Para o caso “\d*”, que quer dizer: zero ou mais dígitos:
start=0, end=0, group=[]
start=1, end=3, group=[12]
start=3, end=3, group=[]
start=4, end=5, group=[3]
start=5, end=5, group=[]
start=6, end=9, group=[456]
start=9, end=9, group=[]
start=10, end=10, group=[]

Para o caso “\d?”, que quer dizer: zero ou 1 dígito:
start=0, end=0, group=[]
start=1, end=2, group=[1]
start=2, end=3, group=[2]
start=3, end=3, group=[]
start=4, end=5, group=[3]
start=5, end=5, group=[]
start=6, end=7, group=[4]
start=7, end=8, group=[5]
start=8, end=9, group=[6]
start=9, end=9, group=[]
start=10, end=10, group=[]

Não se esqueça que strings começam pela posição zero.