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.