tildes - validar acentos en java
Búsqueda de cadenas de Java ignorando acentos (3)
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.
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 he utilizado 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 que 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?
Collator devuelve 0 para a y á, si lo configura para ignorar 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", "á") se vuelve verdadero ahora
He escrito una clase para buscar a través de textos árabes ignorando el diacrítico (NO eliminándolos). tal vez puedas entender la idea o usarla de alguna manera.
Utiliza java.text.Normalizer
y una toma de regex para deshacerte de los java.text.Normalizer
diacríticos .
public static String removeDiacriticalMarks(String string) {
return Normalizer.normalize(string, Form.NFD)
.replaceAll("//p{InCombiningDiacriticalMarks}+", "");
}
Que puedes usar de la siguiente manera:
String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao