содержит с коллатором - PullRequest
       4

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

12 голосов
/ 05 января 2012

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

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

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

Существует ли простой способ выполнить работу?Может быть, регулярное выражение?

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

Ответы [ 4 ]

18 голосов
/ 05 января 2012

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

Редактировать: для очистки

String normalized = Normalizer.normalize(text, Normalizer.Form.NFD);
String ascii = normalized.replaceAll("[^\\p{ASCII}]", "");
13 голосов
/ 05 января 2012

Посмотрите на Нормализатор .

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

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

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

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

3 голосов
/ 05 января 2012

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

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"));

}
0 голосов
/ 05 января 2012

Обычный способ сделать это - преобразовать обе строки в нижний регистр без ударения, а затем использовать стандартное «содержит».

...