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.