【发布时间】:2011-02-20 03:09:54
【问题描述】:
我希望 apple 和 Apple 比较为 true。
目前
"Apple" == "Apple" # returns TRUE
"Apple" == "APPLE" # returns FALSE
【问题讨论】:
标签: ruby string string-comparison
我希望 apple 和 Apple 比较为 true。
目前
"Apple" == "Apple" # returns TRUE
"Apple" == "APPLE" # returns FALSE
【问题讨论】:
标签: ruby string string-comparison
您正在寻找casecmp。如果两个字符串相等,则返回0,不区分大小写。
str1.casecmp(str2) == 0
"Apple".casecmp("APPLE") == 0
#=> true
或者,您可以将两个字符串都转换为小写 (str.downcase) 并比较是否相等。
【讨论】:
casecmp: 一个区分大小写的傻名字 - in - 敏感的比较方法?!
== 0换成zero?
"Apple".casecmp("APPLE").zero? 但我个人喜欢 Andres 下面的回答,它使用 .casecmp?
在 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 垃圾。
"aBcDeF".downcase == "abcdef"。在 Ruby 2.4+ 中消除了使用 casecmp 的可读性和性能提升。
false 和 nil 有什么区别...
如果您必须比较忽略大小写的 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 工作正常 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
【讨论】:
casecmp 和零?是 ruby 内置的方法。如果两个字符串相等,不区分大小写且为零,casecmp 返回 0?检查零值 (==0)
str1.casecmp(str2).zero?
【讨论】:
0 相比更清晰,尤其是在嵌套更复杂的条件时。
zero? 时引发 NoMethodError