2010-03-07 25 views
26

Estoy tratando de escribir una función de filtro para mi aplicación que tomará una cadena de entrada y filtrará de una forma u otra todos los objetos que no coinciden con la entrada dada. La forma más fácil de hacer esto sería usar el método contains de String, es decir, simplemente verificar si el objeto (la variable String en el objeto) contiene la cadena especificada en el filtro, pero esto no tendrá en cuenta los acentos.Búsqueda de cadenas de Java ignorando acentos

Los objetos en cuestión son básicamente Personas, y las cadenas con las que trato de hacer corresponder son nombres. Entonces, por ejemplo, si alguien busca a Joao, esperaría que João se incluyera en el conjunto de resultados. Ya utilicé la clase Collator en mi aplicación para ordenar por nombre y funciona bien porque puede hacer una comparación, es decir, utilizando la configuración regional de Reino Unido á antes de b pero después de a. Pero obvisouly no devuelve 0 si compara a y á porque no son iguales.

Entonces, ¿alguien tiene alguna idea de cómo podría hacer esto?

+0

duplicado posible de [Java. Ignore los acentos al comparar cadenas] (http://stackoverflow.com/questions/2373213/java-ignore-accents-when-comparing-strings) – Barett

Respuesta

69

Haz uso de java.text.Normalizer y toma de regex para eliminar el diacritics.

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

que se puede utilizar de la siguiente manera:

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

¡Retiro mi respuesta! Nunca te cruces con java.text.Normalizer, gracias por la sugerencia – Brabster

+0

Gracias, exactamente lo que necesitaba. – DaveJohnston

+0

Esto es genial. Estaba tratando de hacer coincidencias de expresiones regulares en cadenas no ascii aunque sin éxito. La normalización parece ser la mejor manera de hacerlo. – ankimal

2

Compaginadora hace retorno 0 para A y A, si se configura para ignorar los signos diacríticos:

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", "á") produce verdadero ahora

0

Escribí una clase para buscar textos arábigos al ignorar el diacrítico (NO eliminarlos). tal vez puedas entender la idea o usarla de alguna manera.

DiacriticInsensitiveSearch.java

Cuestiones relacionadas