Содержит с коллактором
Мне нужно проверить, включена ли строка в другую, но без учета случая или акцента (в данном случае французские акценты).
Например, функция должна возвращать 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".