Как сравнить строки без учета регистра

Я хочу apple и Apple сравнение, чтобы быть true. В настоящее время

"Apple" == "Apple"  # returns TRUE
"Apple" == "APPLE"  # returns FALSE

Ответ 1

Вы ищете casecmp. Он возвращает 0, если две строки равны, без учета регистра.

str1.casecmp(str2) == 0

"Apple".casecmp("APPLE") == 0
#=> true

В качестве альтернативы вы можете преобразовать обе строки в нижний регистр (str.downcase) и сравнить для равенства.

Ответ 3

Если вам нужно сравнить строки UTF-8, игнорируя регистр:

>> str1 = "Мария"
=> "Мария"
>> str2 = "мария"
=> "мария"
>> str1.casecmp(str2) == 0
=> false
>> require 'active_support/all'
=> true
>> str1.mb_chars.downcase.to_s.casecmp(str2.mb_chars.downcase.to_s) == 0
=> true

Он работает таким образом в Ruby 2.3.1 и более ранних версиях.

Для меньшего объема памяти вы можете выбрать string/multibyte:

require 'active_support'
require 'active_support/core_ext/string/multibyte'

Изменить, Ruby 2.4.0:

>> str1.casecmp(str2) == 0
=> false

Итак, casecmp не работает в 2.4.0; Однако в 2.4.0 можно сравнить строки UTF-8 вручную без active_support gem:

>> str1.downcase == str2.downcase
=> true

Ответ 4

casecmp и нуль? являются встроенными методами ruby. casecmp возвращает 0, если две строки равны, нечувствительны к регистру и нулю? проверяет нулевое значение (== 0)

str1.casecmp(str2).zero?

Ответ 5

Для ruby 2.4 работает нормально casecmp? для строк utf-8 (mb_chars не требуется):

'строка1'.casecmp?('СтроКа1')

=> true