dÚvida regex

17 respostas
Gustavo_Santos

Boa tarde galera!

Estou com dúvida quanto ao que o quantificador * (Zero ou mais ocorrências) e ? (Zero ou uma ocorrência) retornam:

Visto que esse trecho de código:

public static void main(String[] args) {
		
		Pattern p = Pattern.compile("\\d*"); // 0 ou mais digitos seguidos.
		Matcher m = p.matcher("1 a12 234b"); //0 1 3 1 2 6 2 3 4 
		
		while(m.find()) {
			System.out.print(m.start() + " ");
		}

	}

Retorna esses valores : 0 1 2 3 5 6 9 10 não sei o que esses representam - índice/grupo ? grupo/índice?

E o quantificador de “zero ou uma ocorrencia” (?):

public static void main(String[] args) {
		
		Pattern p = Pattern.compile("\\d?"); // 0 ou mais digitos seguidos.
		Matcher m = p.matcher("1 a12 234b"); //0 1 3 1 2 6 2 3 4 
		
		while(m.find()) {
			System.out.print(m.start() + " ");
		}
	}

Retorna os índices: 0 1 2 3 4 5 6 7 8 9 10 - porque ? Não é zero ou uma ocorrência ?

Quanto ao quantificador de “uma ou mais ocorrências” (+) está tranquilo:

public static void main(String[] args) {
		
		Pattern p = Pattern.compile("\\d+"); // 0 ou mais digitos seguidos.
		Matcher m = p.matcher("1 a12 234b"); //0 1 3 1 2 6 2 3 4 
		
		while(m.find()) {
			System.out.print(m.start() + " ");
		}
	}

Retorna os índices: 0 3 6 - pois é ai que os números começam.

Grato a todos que ajudarem.

17 Respostas

evertonsilvagomesjav

O negocio é que o start(), representa a posição(indice) que ele achar, e o group() te retorna o que “motor regex” achar.

evertonsilvagomesjav

Esses indices que vc viu, são os indices que ele percorreu. Como vc nao tinha o group() ai nao sabe o que ele esta te retornando. Em relação aos quantificadores o que acontece é o seguinte, como vc esta usando aqui nesse exemplo o "*" que é zero ou mais, ele vai te retorna qualquer coisa ou mais digitos seguidos. Veja que ele vai te retornar vazio que são os indices que não sao os numeros que vc deseja (1, 2, 5, 8, 9, 10).

veja só:

Pattern p = Pattern.compile("\\d*"); // 0 ou mais digitos seguidos.   
	    Matcher m = p.matcher("1 a12 234b"); //0 1 3 1 2 6 2 3 4   
	       
	    while(m.find()) {   
	        System.out.print("Start: " +m.start() +" Group: " +m.group() + "\n");   
	    }
evertonsilvagomesjav

Pra ficar melhor os indices e seus retornos seriam:

0 = 1;

1 = a;

2 = white;

3 = 12;

5 = white;

6 = 234;

9 = b;

10 = white;
Gustavo_Santos

E porque vai até dez ? Os índices não começam com 0 ?
Se tem 10 tokens dezeria ir até 10 não ?!

Kd o Vini pra me ajuda ?! hehe

evertonsilvagomesjav

Gustavo Santos:
E porque vai até dez ? Os índices não começam com 0 ?
Se tem 10 tokens dezeria ir até 10 não ?!

Kd o Vini pra me ajuda ?! hehe

Vai até 10, pq o cursor começa antes do 1 e vai até depois do b. Esqueci de colocar o 1.

Gustavo_Santos

Blz evertonsilvagomesjava, eu entendi.

() O négocio é que o () retorna o índice mesmo quando não há ocorrência (“Zero ou mais ocorrencias”) Dãã hehe.
(+) Só retorna as ocorrências. Correto ?

evertonsilvagomesjav

Gustavo Santos:
Blz evertonsilvagomesjava, eu entendi.

() O négocio é que o () retorna o índice mesmo quando não há ocorrência (“Zero ou mais ocorrencias”) Dãã hehe.
(+) Só retorna as ocorrências. Correto ?

Issssso aÊ brother!!! Por isso seu “*” retornou “nada” onde tinha espaços e letras rsrs, entendeu?

Gustavo_Santos

então tenho sempre que contar com mais de 1 correto com relação ao índice?

Entendi sim cara, BRIGADÃO ! O DUVIDAZINHA QUE NÃO SAIA !!!

evertonsilvagomesjav

Não entendi a pergunta.

Gustavo_Santos

ããn não estou sabendo explicar direito, é assim:

Existe mais um espaço em branco depois do b ?! é isso ? ou antes do primeiro token?

você disse que ele começa antes do primeiro e vai até depois do ultimo token, iniciando no índice 0.
Ainda não entendi porque ir até o 10 ?

Entendeu ?

de antemão, brigadão pela força !!!

evertonsilvagomesjav

Gustavo Santos:
ããn não estou sabendo explicar direito, é assim:

Existem mais um espaço em branco depois do b ?! é isso ? ou antes do primeiro cara ?

você disse que ele começa antes do primeiro e vai até depois do ultimo token, iniciando no índice 0.

Sim, seria assim:

l1lespaçolal12lespaçol234lblespaço

Os cursores ai representam os indices.

Gustavo_Santos

Show meu velho !!!

Tem só mais uma coisa que não entendi, que é:

No livro a Keity diz que esse código:

public static void main(String[] args) {

		Pattern p = Pattern.compile("\\.*xx");  
		Matcher m = p.matcher("yyxxxyxx"); 
		
		while (m.find()) {
			System.out.println(m.start() + " " + m.group());
		}
	}

produz a saída: 0 yyxxxyxx, porque estou usando quantificadores ganânciosos.

Porém aqui na minha máquina, essa não é a saida.
Quando executo, tenho essa saída:

2 xx
6 xx

Estou fazendo algo errado, ou é mais um erro do livro? Inicio da pág 276, livro da Keity 1.5

evertonsilvagomesjav

Todo indice é assim, vc ja viu o método substring da classe String? O que usa sobrecarga dessa forma:

Onde na API temos:

Parameters:
beginIndex - the begin index, inclusive.
endIndex - the end index, exclusive.

Ou seja se fizermos:

String nome = "Gustavo"; nome = nome.substring(0,2);

como o “end index é exclusive” , de acordo com o que te passei em relação aos cursores onde eles iniciam vc vai ver que a posição dois nao vai vir
e o retorno sera “Gu”.

evertonsilvagomesjav

Gustavo Santos:
Show meu velho !!!

Tem só mais uma coisa que não entendi, que é:

No livro a Keity diz que esse código:

public static void main(String[] args) {

		Pattern p = Pattern.compile("\\.*xx");  
		Matcher m = p.matcher("yyxxxyxx"); 
		
		while (m.find()) {
			System.out.println(m.start() + " " + m.group());
		}
	}

produz a saída: 0 yyxxxyxx, porque estou usando quantificadores ganânciosos.

Porém aqui na minha máquina, essa não é a saida.
Quando executo, tenho essa saída:

2 xx
6 xx

Estou fazendo algo errado, ou é mais um erro do livro? Inicio da pág 276, livro da Keity 1.5

Não tem como não ser outra saida, eu nao lembro de cabeça á errata do livro, mas provavelmente deve ser erro sim.

Gustavo_Santos

Por exemplo, ela diz que:

" Em geral um busca regex roda da ESQUERDA para a DIREITA e, depois que um
caracter da fonte tenha sido usado em um ocorrência, ele não pode ser reutilizado".
pág 273.

na pág 276, ela diz que:

" O quantificador ganancioso de fato lê todo o conjunto-fonte de dados, e depois volta
(procura da DIREITA para a ESRQUEDA) até achar a correspondência mais a DIREIRA.
"
Tipo segunda vez que leio esse capítulo e ainda estou na dúvida. Sou eu que estou fazendo confusão, ou
foi a tradução, e de fato QUAL O QUANTIFICADOR QUE TENHO QUE SABER PARA A PROVA ?

Gustavo_Santos

Blz Brother já deu uma boa clariada !

Bons estudos.

evertonsilvagomesjav

Gustavo Santos:
Blz Brother já deu uma boa clariada !

Bons estudos.

Fiz os testes aqui em ksa e o resultado é o mesmo, outra coisa tb, não se preocupe com tais exemplos desse tipo, nao vai cair no exame. Se vc entendeu bem os exemplos anteriores ja esta de bom tamanho.

Criado 30 de agosto de 2010
Ultima resposta 30 de ago. de 2010
Respostas 17
Participantes 2