Comparar cadenas ignorando acentos en Java

En Java, suele ser habitual comparar cadenas de texto. La clase String ya proporciona varias funciones para hacer estas comparaciones según nos interese:

  • equals(«…») – Para comparar cadenas en Java: compara la cadena sobre la cual se aplica la función con la cadena que se pasa como parámetro. Devuelve true si son idénticas y false si no lo son.
  • equalsIgnoreCase(«…») – Igual que la función anterior, pero esta vez no tiene en cuenta si las letras son mayúsculas o minúsculas.

Estas funciones suelen ser suficiente en la mayoría de casos. Pero hay idiomas, como el castellano o el català, donde también entran en juego las tildes. Nos encontraremos con usuarios que cometan faltas de ortografía al no poner las tildes que correspondan. Pero también es bastante habitual omitir las tildes en las búsquedas, dando por hecho que se devolverán tanto los casos con tilde como los que no la tengan.

En estos casos, las funciones que hemos visto arriba no funcionarían como esperamos, al diferenciarlos como dos caracteres distintos.

La solución en estos casos, pasa por normalizar ambas cadenas de texto antes de compararlas entre sí. Vamos a ver cómo podemos normalizarlas.

Normalizar un string con la clase Normalizer

Java ya incorpora una función en la clase Normalizer que nos puede ayudar a normalizar las cadenas de texto antes de compararlas. Está presente desde Java 8.

import java.text.Normalizer;

import java.text.Normalizer.Form;

  private String normalizarTexto(String string) {

    return Normalizer.normalize(string, Form.NFD)

    .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")

    .toLowerCase();

}

Esta función, aplica a cada cadena 3 transformaciones:

  • Normalizer.normalize(string, Form.NFD) – Realiza una descomposición canónica, separando las letras con tildes abiertas y cerradas, diéresis y demás, en dos caracteres. Por ejemplo, «á» quedaría como «a´».
  • .replaceAll(«\p{InCombiningDiacriticalMarks}+», «») – Elimina las tildes, diéresis, etc. de la cadena ya normalizada por la función anterior. Por lo tanto, «a´» quedaría como simplemente «a».
  • .toLowerCase() – Por último, pasaría todas las letras a minúsculas, para que no haya diferencia entre mayúsculas y minúsculas.

Con esto, un ejemplo de comparación utilizando esta función que devolvería true (las cadenas son iguales), sería el siguiente.

normalizarTexto("Serán Idénticas").equals( normalizarTexto("seRan IdenticaS") )

Deja un comentario

Pin It on Pinterest