Вопрос-ответ

How do I make my string comparison case-insensitive?

Как мне сделать сравнение строк нечувствительным к регистру?

Я создал Java-программу для сравнения двух строк:

String str = "Hello";

if (str.equals("hello")) {
System.out.println("match");
} else {
System.out.println("no match");
}

Оно чувствительно к регистру. Как я могу изменить его, чтобы это было не так?

Переведено автоматически
Ответ 1

Лучший способ - использовать str.equalsIgnoreCase("foo"). Он оптимизирован специально для этой цели.

Вы также можете преобразовать обе строки в верхний или нижний регистр, прежде чем сравнивать их с equals. Этот трюк полезно запомнить для других языков, в которых может не быть эквивалента equalsIgnoreCase.

str.toUpperCase().equals(str2.toUpperCase())

Если вы используете нелатинский алфавит, обратите внимание на эту часть JavaDoc из equalsIgnoreCase, в которой говорится


Обратите внимание, что этот метод не учитывает локаль и приведет к неудовлетворительным результатам для определенных локалей. Класс Collator обеспечивает сравнение с учетом локали.


Ответ 2

Использование String.equalsIgnoreCase().

Используйте ссылку на Java API, чтобы найти ответы, подобные этим:

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase (java.lang.String)

https://docs.oracle.com/javase/1.5.0/docs/api/

Ответ 3

String.equalsIgnoreCase это наиболее практичный выбор для наивного сравнения строк без учета регистра.

Однако полезно знать, что этот метод не выполняет ни полного свертывания по регистру, ни декомпозиции и поэтому не может выполнять сопоставление без регистра, как указано в стандарте Unicode. Фактически, API-интерфейсы JDK не предоставляют доступ к информации о символьных данных, изменяющих регистр, поэтому эту работу лучше всего делегировать проверенной сторонней библиотеке.

Эта библиотека называется ICU, и вот как можно реализовать утилиту для сравнения строк без учета регистра:

import com.ibm.icu.text.Normalizer2;

// ...

public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
return normalizer.normalize(s).equals(normalizer.normalize(t));
}
    String brook = "flu\u0308ßchen";
String BROOK = "FLÜSSCHEN";

assert equalsIgnoreCase(brook, BROOK);

Наивное сравнение с помощью String.equalsIgnoreCase, или String.equals для строк в верхнем или нижнем регистре завершится неудачей даже в этом простом тесте.

(Обратите внимание, однако, что предопределенная функция сворачивания регистра getNFKCCasefoldInstance не зависит от локали; для турецких локалей может потребоваться немного больше работы UCharacter.foldCase).

Ответ 4

Вы должны использовать compareToIgnoreCase метод String объекта.

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0) это означает str1 равно str2.

java string