如何比较忽略大小写的字符串

我希望 appleApple的比较是 true。 现在

"Apple" == "Apple"  # returns TRUE
"Apple" == "APPLE"  # returns FALSE
102232 次浏览

您正在寻找 casecmp。如果两个字符串相等,它返回 0,不区分大小写。

str1.casecmp(str2) == 0


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

或者,可以将这两个字符串转换为小写(str.downcase)并进行比较以求相等。

如果你必须比较 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

Ruby 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

这里有更多信息

Casecmp 和0?是 Ruby 内置方法。如果两个字符串相等,casecmp 返回0,不区分大小写,返回0?检查零值(= = 0)

str1.casecmp(str2).zero?

对于 ruby 2.4,utf-8字符串(不需要 mb _ chars)的 Casecmp?运行良好:

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