Expressões regulares

3 respostas
N

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á.

3 Respostas

ivandasilva

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.

deyvid

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

Nykolas_Lima

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

Criado 21 de dezembro de 2009
Ultima resposta 22 de dez. de 2009
Respostas 3
Participantes 4