Dúvida: Regex

6 respostas
ataufo

Não consigo entender a saída do código abaixo:

public class TesteRegex {
	
	public static void main(String[] args){
		
		Pattern expressao = Pattern.compile("\\d*");
		
		Matcher fonte = expressao.matcher("ab34ef");
		
		System.out.println(expressao.pattern());
		
		int i=1;
		
		while(fonte.find()){
			
			System.out.println(i++ + "º vez");
			System.out.println("Posição: " + fonte.start() + "  Correspondencia: " + fonte.group());
			
		}
	}
}

Saída:
\d*
1º vez
Posição: 0 Correspondencia:
2º vez
Posição: 1 Correspondencia:
3º vez
Posição: 2 Correspondencia: 34
4º vez
Posição: 4 Correspondencia:
5º vez
Posição: 5 Correspondencia:
6º vez
Posição: 6 Correspondencia:

Alguem consegue me explicar a lógica dessa saída?

Como o método start() retorna o valor 6, se os índices da fonte vão de 0 a 5 ? Porque o While é executado 6 vezes?

Porque após encontrar a correspondência 34 na posição 2, ele pula para o índice 4 ?

Obrigado galera

6 Respostas

T

Note que o caractere * significa “0 ou mais vezes”. Entao, o que ele está fazendo é casar várias vezes com strings vazias.
Por exemplo, na primeira vez ele casa com a substring entre o comeco da string e o caractere 'a’
O método start() retorna 6 porque a substring que ele casa é a que comeca e termina na posicao 6.

dm_thiago

Só para completar o que o tpresa falou, imagino que você queria um ‘+’ (um ou mais) no lugar do ‘*’.

Lord

Fala Ataufo… oque ocorre é o seguinte uma String é um array de caractéres entaum sua entrada de dados ficária assim :

[0] = "a"
[1] = "b"
[2] = "3"
[3] = "4"
[4] = "e"
[5] = "f"

Quanto a sua expressão regular o “\d*” , você está procurando caractéres numéricos e a frequência como o tpresa postou acima o “*” significa “0 ou mais vezes”.Entaum sua expressão regular apenas vai ser aplicada quando um caracter numérico for encontrado, como a posição 2 encontrou duas ocorrências ele quarda as posições do array da entrada e continua a iteração, na posição 3 naum há saída pois esta posição já foi referênciada.
Para entender melhor e testar sua expressões regulares utilize este site http://gskinner.com/RegExr/

ataufo

Entendi porque ele pula para o índice 4, porém ainda acho mto estranho ele informar uma posição 6. Até porque uma substring(6,6) não existe.

Obrigado galera.

AUser

Strings neste caso funcionam por índice, e não como um “array”.

Então, seria:

|A|B|3|4|E|F|
1 2 3 4 5 6 7

Entendeu?

ataufo

não, pq ele indica as posiçoes de 0 a 6 e não de 1 a 7.

Criado 12 de julho de 2009
Ultima resposta 14 de jul. de 2009
Respostas 6
Participantes 5