2010-03-07 18 views
26

Ich versuche eine Filterfunktion für meine Anwendung zu schreiben, die eine Eingabezeichenfolge nimmt und alle Objekte ausfiltert, die nicht mit der gegebenen Eingabe übereinstimmen. Der einfachste Weg, dies zu tun, wäre, die contains-Methode von String zu verwenden, d. H. Einfach zu prüfen, ob das Objekt (die String-Variable im Objekt) die im Filter angegebene Zeichenfolge enthält, aber keine Akzente berücksichtigt.Java String Suche ignorieren Akzente

Die Objekte in Frage sind im Grunde Personen, und die Zeichenfolgen, die ich versuche, zu entsprechen, sind Namen. Wenn zum Beispiel jemand nach Joao sucht, würde ich erwarten, dass Joáo in die Ergebnismenge aufgenommen wird. Ich habe bereits die Collator-Klasse in meiner Anwendung verwendet, um nach Namen zu sortieren, und es funktioniert gut, weil es vergleichen kann, d. H. Das UK-Gebietsschema wird vor, aber nach a verwendet. Aber observiously gibt 0 nicht zurück, wenn Sie a und á vergleichen, weil sie nicht gleich sind.

Also hat jemand eine Idee, wie ich das vielleicht könnte?

+0

Mögliches Duplikat von [Java. Ignoriere Akzente beim Vergleichen von Strings] (http://stackoverflow.com/questions/2373213/java-ignore-accents-when-comparing-strings) – Barett

Antwort

69

Verwenden Sie java.text.Normalizer und eine Aufnahme von Regex, um die diacritics loszuwerden.

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

Welche Sie wie folgt verwendet werden:

String value = "Joáo"; 
String comparisonMaterial = removeDiacriticalMarks(value); // Joao 
+1

Ich ziehe meine Antwort zurück! Kommen Sie nie auf java.text.Normalizer, danke für den Tipp – Brabster

+0

Danke, genau was ich brauchte. – DaveJohnston

+0

Das ist großartig. Ich habe versucht, Regex-Matches auf Nicht-ASCII-Strings durchzuführen, wenn auch ohne Erfolg. Die Normalisierung scheint der beste Weg zu sein. – ankimal

2

Collator tut return 0 für A und A, wenn Sie so konfigurieren, dass diakritische Zeichen ignorieren:

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 ("a", "á") ergibt nun wahr

0

Ich habe eine Klasse für die Suche nach arabischen Texten geschrieben, indem ich Diakritika ignoriert (NICHT lösche). vielleicht kannst du die Idee bekommen oder sie irgendwie benutzen.

DiacriticInsensitiveSearch.java