Mais uma de regex

Olá galera,

Minha dúvida é nesse código:

[code]public class Regex3 {
public static void main(String… args) {

	Pattern p = Pattern.compile("a*b");
	Matcher m = p.matcher("aaaaaaabc");
	
            boolean b = m.matches();
            //m.reset();
            boolean b1 = m.find();
            
	System.out.println(b + " " + b1 + " " + m.group());
}

}[/code]

A saída é:
false true b

Mas se eu descomento a linha m.reset(); a saída muda para:
false true aaaaaaab

Não entendi direito porque a saída é alterada se eu reseto o Matcher. Parece que quando a linha está comentada o texto começa ser avaliado a partir da letra “b” deixando de lado as letras “a” que passaram, é isso mesmo? Porque?

Na documentação fala que o find começa a verificar do começo do texto em diante ou a partir do primeiro carácter que não casou com ninguém anteriormente se o find tiver sido executado antes com sucesso:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html#find()
“This method starts at the beginning of the input sequence or, if a previous invocation of the method was successful and the matcher has not since been reset, at the first character not matched by the previous match.”
Não sei se esse trecho da documentação tem a ver com a minha dúvida ou se ajuda vocês a esclarecem para mim as diferentes saídas.

Obrigado.

EdiT - Expliquei errado, aham

O seu problema é o seguinte: você só pode pegar o valor de group() se matches() retorna true. Se retornar “false”, então group retorna um valor indefinido. E é por isso que ele mostra “b” - poderia mostrar qualquer outra coisa, na verdade.

Além disso, matches() tem um outro problema: se você for usar “find”, a posição inicial fica indefinida também. Não misture as coisas.