Как сравнить строки без учёта регистра
Короткий ответ
Используйте equalsIgnoreCase():
void main() {
IO.println("Hello".equalsIgnoreCase("HELLO"));
IO.println("Hello".equals("HELLO"));
}Результат:
true
falseПорядок без учёта регистра
compareToIgnoreCase() сравнивает строки по алфавиту, не обращая внимания на регистр:
void main() {
IO.println("apple".compareToIgnoreCase("BANANA") < 0);
IO.println("apple".compareTo("BANANA") < 0);
}Результат:
true
falseСортировка списка
Готовый компаратор String.CASE_INSENSITIVE_ORDER сортирует строки без учёта регистра:
void main() {
var names = new ArrayList<>(List.of("oleg", "Anna", "boris"));
names.sort(String.CASE_INSENSITIVE_ORDER);
IO.println(names);
}Результат:
[Anna, boris, oleg]Поиск в списке
contains() учитывает регистр, поэтому для поиска без него пройдитесь потоком с equalsIgnoreCase():
void main() {
var roles = List.of("Admin", "Editor");
IO.println(roles.contains("admin"));
IO.println(roles.stream().anyMatch(role -> role.equalsIgnoreCase("admin")));
}Результат:
false
trueЧастая ошибка
Приведение к нижнему регистру через toLowerCase() без аргументов зависит от языка системы. В турецкой локали "TITLE".toLowerCase() даёт "tıtle" с точкой-без-точки, и сравнение ломается:
void main() {
var turkish = Locale.of("tr");
IO.println("TITLE".toLowerCase(turkish).equals("title"));
IO.println("TITLE".equalsIgnoreCase("title"));
}Результат:
false
trueДля сравнения используйте equalsIgnoreCase(), а если нужен toLowerCase(), передавайте Locale.ROOT.
Функции из этого ответа
- String.equalsIgnoreCase() — Сравнивает две строки без учёта регистра букв.
- String.compareTo() — Сравнивает две строки по алфавиту (лексикографически).
- String.toLowerCase() — Возвращает копию строки, где все буквы строчные.
- String.equals() — Сравнивает содержимое двух строк.