Ruby string compare независимо от регистра строки


Мне нужно проверить для

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

в Ruby.

Мне нужно сравнение строк,но для проверки не учитывается регистр.

4 144

4 ответа:

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

str1.casecmp(str2) == 0

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

кроме того, вы можете конвертировать обе строки в нижний регистр (str.downcase) и сравнить на равенство.

на Руби 2.4.0 у вас есть: casecmp?(other_str) → true, false, or nil

"abcdef".casecmp?("abcde")     #=> false
"aBcDeF".casecmp?("abcdef")    #=> true
"abcdef".casecmp?("abcdefg")   #=> false
"abcdef".casecmp?("ABCDEF")    #=> true

здесь у вас есть больше информации

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

>> 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'

Edit, 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

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

str1.casecmp(str2).zero?