Поиск строки 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