Regex, busca usando metacaracteres

4 respostas
derheimen

Alguém poderia me explicar, como funciona o metacaracter "." (ponto).
No livro da Kathy Sierra, descreve da seguinte forma : "Qualquer caracter serve".
Segue o exemplo abaixo.

public class RegexGuj {
	static StringBuilder sbI = new StringBuilder(); // Indices do grupos
	static StringBuilder sbG = new StringBuilder(); // Grupos de dados

	public static void main(String[] args) {
		executaRegex_Pattern_Matcher("a.c", "ac abc a c aoc");
	}

	public static void executaRegex_Pattern_Matcher(String exp, String font) {
		Pattern p = Pattern.compile(exp); // a expressão
		Matcher m = p.matcher(font); // a fonte, usa o Pattern p/ criar um Matcher
		while(m.find()) { // Inicia o motor regex e realiza a busca
			sbI.append(m.start()+" ");
			sbG.append(m.group()+" ");
		}
		System.out.println("Fonte Dados: "+font+ "\nExpressão: "+exp);
		System.out.println("Indices -> " + sbI);
		System.out.println("Groupos -> " + sbG + "\n");
	}
}

Saída:
Fonte Dados: ac abc a c aoc
Expressão: a.c
Indices -> 3 7 11
Groupos -> abc a c aoc

Tudo que seja "a", "c", dados entre "a" e "c", virá no resultado ?????

Desde já agradeço.

4 Respostas

T

A sua expressão bate com:
“abc”
“a<espaço>c”
“aoc”

Petronio_Braga

Heider Matos,

dá uma olhada neste link:

http://www.javafree.org/javabb/viewtopic.jbb?t=5090

Acho que te ajudará.

///

Quanto a saída do problema, vamos a explicação.

O metacaracter “.” (ponto), funciona o seguinte, ele reconhece qualquer caracter (apenas 1 caracter).

Você está criando um Pattern (“a.c”) e manda procurar na String (“ac abc a c aoc”) usando a classe Matcher.

o while fica procurando o padrão que você quer. Ele fica quebrando a String de 3 em 3 caracteres (nesse caso) e e comparando com a expressão que você passou para ver se é válido.

Quebrando a String

Índice 0 - “ac " (Padrão não reconhecido)
Índice 1 - “c a” (Padrão não reconhecido)
Índice 2 - " ab” (Padrão não reconhecido)
Índice 3 - “abc” (Padrão reconhecido, por que existe apenas 1 caracter entre a e c [(a.c) = (abc)])
Índice 4 - “bc " (Padrão não reconhecido)
Índice 5 - “c a” (Padrão não reconhecido)
Índice 6 - " a " (Padrão não reconhecido)
Índice 7 - “a c” (Padrão reconhecido, por que existe apenas 1 caracter entre a e c [(a.c) = (a c)])
Índice 8 - " c " (Padrão não reconhecido)
Índice 9 - “c a” (Padrão não reconhecido)
Índice 10 - " ao” (Padrão não reconhecido)
Índice 11 - “aoc” (Padrão reconhecido, por que existe apenas 1 caracter entre a e c [(a.c) = (aoc)])

Espero ter ajudado.

derheimen

Muito obrigado Petrônio pela explicação, acho que agora entendi legal.

Neste exemplo o “.”(ponto), poderia ser tanto um alfanumérico, digito, caracter especial ?

Petronio_Braga

Heider Matos,

pode ser qualque caracter. A única restrição é que é apenas 1 caracter. Se quiser mais caracteres você utilizará o metacaracter “+” ou “*”. Vejá a explicação no link que te passei.

Cada metacaracter trabalha de um jeito diferente e consequentemente o m.find() também.

Até mais.

Criado 8 de janeiro de 2007
Ultima resposta 8 de jan. de 2007
Respostas 4
Participantes 3