Поиск строки Java, игнорирующий акценты
Я пытаюсь написать функцию фильтра для моего приложения, которая примет строку ввода и отфильтрует все объекты, которые каким-либо образом не соответствуют указанному входу. Самый простой способ сделать это - использовать метод String, т.е. Просто проверить, содержит ли объект (переменная String в объекте) строку, указанную в фильтре, но это не будет учитывать акценты.
Объекты, о которых идет речь, это в основном люди, а строки, которые я пытаюсь сопоставить, - это имена. Так, например, если кто-то ищет Жоао, я ожидаю, что Joáo будет включен в результирующий набор. Я уже использовал класс Collator в своем приложении для сортировки по имени, и он работает хорошо, потому что он может сравнивать, т.е. С использованием UK Locale à до b, но после a. Но obvisouly он не возвращает 0, если вы сравниваете a и á, потому что они не равны.
Знает ли кто-нибудь, как я могу это сделать?
Ответы
Ответ 1
Используйте java.text.Normalizer
и снимок регулярного выражения, чтобы избавиться от диакритические.
public static String removeDiacriticalMarks(String string) {
return Normalizer.normalize(string, Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}
Что вы можете использовать следующим образом:
String value = "Joáo";
String comparisonMaterial = removeDiacriticalMarks(value); // Joao
Ответ 2
Collator возвращает 0 для a и á, если вы настроите его на игнорирование диакритики:
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", "á" ) теперь возвращает true
Ответ 3
Я написал класс для поиска арабских текстов, игнорируя диакритические (НЕ удаляя их). возможно, вы можете получить идею или использовать ее в некотором роде.
DiacriticInsensitiveSearch.java