Java chaîne de recherche à ignorer les accents

j'essaie d'écrire une fonction de filtre pour mon application qui prendra une chaîne d'entrée et filtrera tous les objets qui ne correspondent pas à l'entrée donnée d'une façon ou d'une autre. La façon la plus simple de faire cela serait d'utiliser la méthode des fichiers contains de String, c'est-à-dire vérifier si l'objet (la variable String dans l'objet) contient la chaîne spécifiée dans le filtre, mais cela ne tiendra pas compte des accents.

les objets en question sont essentiellement des personnes, et les cordes que j'essaie de faire correspondre sont nom. Par exemple, si Quelqu'un cherche Joao, Je m'attendrais à ce que Joáo soit inclus dans le jeu de résultats. J'ai déjà utilisé la classe Collator dans mon application pour trier par nom et cela fonctionne bien parce qu'il peut comparer, c.-à-d. en utilisant le local britannique á vient avant b mais après a. Mais il ne retourne pas 0 si vous comparez a et á parce qu'ils ne sont pas égaux.

est-ce que quelqu'un a une idée de comment je pourrais faire ça?

29
demandé sur DaveJohnston 2010-03-07 23:20:39

3 réponses

utiliser java.text.Normalizer et un coup de regex pour se débarrasser de l' les signes diacritiques.

public static String removeDiacriticalMarks(String string) {
    return Normalizer.normalize(string, Form.NFD)
        .replaceAll("\p{InCombiningDiacriticalMarks}+", "");
}

vous pouvez utiliser comme suit:

String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao
76
répondu BalusC 2010-03-07 20:27:27

Collateur return 0 pour un et des plats, si vous le configurez pour ignorer les signes diacritiques:

public boolean isSame(String a, String b) {
    Collator insenstiveStringComparator = Collator.getInstance();
    insenstiveStringComparator.setStrength(Collator.PRIMARY);
    // Collator.PRIMARY also works, but is case senstive
    return insenstiveStringComparator.compare(a, b) == 0;
}

isSame("un", "á"), les rendements vrai maintenant

4
répondu Benny Bottema 2016-10-31 12:04:07

j'ai écrit une classe pour la recherche à travers les textes arabes en ignorant diacritique (ne pas les enlever). peut-être que vous pouvez obtenir de l'idée ou de l'utiliser d'une certaine façon.

Diacriticinsensitivesensitivesearch.java

0
répondu mehdok 2017-07-19 15:46:13