Содержит с коллактором

Мне нужно проверить, включена ли строка в другую, но без учета случая или акцента (в данном случае французские акценты).

Например, функция должна возвращать true, если я ищу "rhone" в строке "Vallée du Rhône".

Коллатор полезен для сравнения строк с акцентами, но не предоставляет функцию contains.

Есть ли простой способ выполнить эту работу? Возможно, существует регулярное выражение?

Дополнительная информация:
Мне просто нужно вернуть значение true/false, меня не интересует количество совпадений или позиция тестовой строки в ссылочной строке.

Ответ 1

Вы можете использовать Normalizer, чтобы уменьшить количество строк в урезанных версиях, которые вы можете сравнить напрямую.

Изменить:, чтобы быть четким

String normalized = Normalizer.normalize(text, Normalizer.Form.NFD);
String ascii = normalized.replaceAll("[^\\p{ASCII}]", "");

Ответ 2

Посмотрите Normalizer.

Вы должны называть его Normalizer.Form.NFD в качестве второго аргумента.

Итак, это будет:

Normalizer.normalize(yourinput, Normalizer.Form.NFD)
    .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
    .toLowerCase()
    .contains(yoursearchstring)

который вернет true, если соответствует (и, конечно, false в противном случае)

Ответ 3

Как насчет этого?

private static final Pattern ACCENTS_PATTERN = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");

public static boolean containsIgnoreCaseAndAccents(String haystack, String needle) {
    final String hsToCompare = removeAccents(haystack).toLowerCase();
    final String nToCompare = removeAccents(needle).toLowerCase();

    return hsToCompare.contains(nToCompare);
}

public static String removeAccents(String string) {
    return ACCENTS_PATTERN.matcher(Normalizer.normalize(string, Normalizer.Form.NFD)).replaceAll("");
}

public static void main(String[] args) {
    System.out.println(removeAccents("Vallée du Rhône"));
    System.out.println(removeAccents("rhone"));
    System.out.println(containsIgnoreCaseAndAccents("Vallée du Rhône", "rhone"));

}

Ответ 4

Обычный способ сделать это - преобразовать обе строки в нижний регистр без акцентов, а затем использовать стандартный "contains".