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


Answers:


273

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

str1.casecmp(str2) == 0

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

另外,您可以将两个字符串都转换为小写(str.downcase)并进行比较以得出相等性。


19
根据我的基准,casecmp至少是小写方法的两倍
雅各布

77
casecmp:一个病例一个愚蠢的名字敏感的比较方法?
Zabba


17
如果你喜欢使用的话,可以更换== 0zero?
安德鲁·格林

3
如果您使用Rubocop的正确方法是不要抱怨,"Apple".casecmp("APPLE").zero?但我个人喜欢下面的安德烈斯答案,该答案使用.casecmp?
8bithero

45

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

在这里您有更多信息


3
该方法的一个很好的改进,但这是我见过的最少的“ Ruby听起来”方法之一。感觉就像我正在将Java与这个casecmp垃圾一起使用。
约书亚·品特

老实说,我建议您使用"aBcDeF".downcase == "abcdef"casecmpRuby 2.4+消除了更多的可读性和使用性能的提高。
约书亚·品特

等待,会区别是什么之间falsenil像这样的API ...
Trejkaz

根据文档,当other_str不是字符串时,返回nil
ramblex

8

如果您必须比较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中,可以不用active_supportgem 手动比较UTF-8字符串:

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

5

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

str1.casecmp(str2).zero?

这就是我的样式检查器告诉我的,并且我喜欢它,因为它比起与literal相比更加清晰0,尤其是在嵌套更多涉及条件的情况下。
阿莫斯·夏皮拉

5

对于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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.