Expressões regulares

Olá pessoal,

Tem a seguinte questão do livro SCJP sobre expressões regulares:

import java.util.regex.*;

class Regex2{
	public static void main(String[] args){
		Pattern p = Pattern.compile(args[0]);
		Matcher m = p.matcher(args[1]);
		boolean b = false;
		while (b = m.find()){
			System.out.println(m.start() + m.group());
		}
	}
}

E dado o seguinte comando:

java Regex2 "\d*" ab34ef

A saída é 01234456

Porquê a posição 6 foi incluída, se a última posição do texto é 5?

Agradeço desde já.

Quando o método start() encontra os caracteres 3 e 4 ele adiciona ao contardor, assim chega no número 6.

Não sei se ficou claro mas rode somente com o método start() sem a concatenação com group() que você irá notar a diferença.

Fale nilo_sj, não desmerencedo a resposta da ivandasilva mas acho que esse link pode te ajudar.

http://java.sun.com/docs/books/tutorial/essential/regex/literals.html

dá uma lida e reponde aí se você entendeu.

Um abração pra ti e bons estudos

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…

Valeu