[RESOLVIDO]Pesquisar ignorando acentuação

Boa tarde pessoal tenho um metodo para pesquisar uma palavra ou qualquer coisa que o usuario digitar, dentro de um JEditorPane.

Só que se no texto tiver a palavra “TÍTULO” ( Com acento ), e no campo de pesquisa ele digitar “TITULO” ( Sem acento ) a pesquisa não retorna resultados

algum teria alguma ideia?

segue meu código abaixo.

public void pesquisarTexto() {
		editorPanePrincipal.selectAll();
		String texto = editorPanePrincipal.getSelectedText().toUpperCase();

		if (texto != null) {

			Pattern p = Pattern.compile(textFieldPesquisar.getText().toUpperCase());
			Matcher m = p.matcher(texto);

			int contadorPosicoes = 0;

			if ((posicoesPesquisa == null) || (!pesquisarPor.equalsIgnoreCase(textFieldPesquisar.getText()))) {
				posicoesPesquisa = new ArrayList<Integer>();

				pesquisarPor = textFieldPesquisar.getText();
				tamanhoStringPesquisa = textFieldPesquisar.getText().length();
				contadorBotao = 0;

				while (m.find()) {
					posicoesPesquisa.add(contadorPosicoes, m.start());
					contadorPosicoes++;
				}
			}

			if (contadorBotao <= posicoesPesquisa.size() - 1) {
				editorPanePrincipal.grabFocus();
				editorPanePrincipal.setSelectionStart(posicoesPesquisa.get(contadorBotao));
				editorPanePrincipal.setSelectionEnd(posicoesPesquisa.get(contadorBotao) + tamanhoStringPesquisa);
				contadorBotao++;
			} else
				contadorBotao = 0;

			if (posicoesPesquisa.size() == 0) {
				JOptionPane.showMessageDialog(null, "Expressão não encontrada.");
				textFieldPesquisar.grabFocus();
				textFieldPesquisar.setSelectionStart(0);
				textFieldPesquisar.setSelectionEnd(textFieldPesquisar.getText().length());
			}
		}
	}

No momento que o usuário digitar faça um replace nos caracteres que vc deseja retirar.

mais como eu faria o replace de todas as acentuações?

Scorsatto,

Tem um jeito de fazer isso, que eu já empreguei uma vez. Não sei se te atenderia, mas o que eu fiz foi remover o acento e símbolos da palavra que eu busco e comparar com o que existe no banco.

String joaoSemAcento = Normalizer.normalize("João", Normalizer.Form.NFD).replaceAll("[^\p{ASCII}]", "");

Só traduzindo um pouco esse código, o Normalizer é uma classe fornecida pelo java.text o método normalize com a forma NFD quebra a string com símbolos de um jeito canônico:
João = Joa?o
Aí com o replaceAll, eu aplico o pattern para remover tudo que não for caracter ASCII, sobrando apenas a string “Joao”. Bastaria pegar essa string e fazer o equals dela.

Agora se vc quiser algo mais apurado existem APIs de busca fonética, idéia parecida com o “Você quis dizer” do Google.

Abraços

Não tinha visto a do amigo acima, mas o código dele ficou mais simples que o meu… Ambos fazem a mesma coisa… Porém o dele está mais simples…

String texto = "ÁÀÂÃ";		
texto = Normalizer.normalize(texto,Normalizer.Form.NFD);
texto = texto.replaceAll("[^\p{ASCII}]", "");
System.out.println(texto);

Obrigado felipepedrini e lucas_carvalho100,

o código funcionou perfeitamente, como eu gravo a posição de cada um tive que fazer um replace a mais

.replace("º", " ")

pois este caracter estava sumindo portanto subistituo o mesmo por “espaço” assim pego a posição correta.

Se vc precisa do caracter º

Então prefira a seguinte abordagem:

String joaoSemAcento = Normalizer.normalize("Joãoº", Normalizer.Form.NFD).replaceAll("\p{InCombiningDiacriticalMarks}+", "");

Ele vai ter como resultado: “Joaoº”

Abraços

não necessito do caracter, mais achei bem melhor do que o “ajuste” qu fiz

este replace serve apenas para º ou para ª tambem?

Testei aqui e funciona, desculpe ter perguntado sem testar.

muito obrigado felipepedrini.