Как сравнить строки без учета регистра - PullRequest
162 голосов
/ 16 мая 2010

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

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

Ответы [ 5 ]

259 голосов
/ 16 мая 2010

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

str1.casecmp(str2) == 0

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

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

36 голосов
/ 01 марта 2017

В Рубин 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

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

8 голосов
/ 30 января 2016

Если вам нужно сравнить строки 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
5 голосов
/ 03 июля 2017

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

str1.casecmp(str2).zero?
1 голос
/ 09 апреля 2019

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

2.4.1 :062 > 'строка1'.casecmp?('СтроКа1')
 => true

, но casecmp не работает для utf-8:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
...