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

196

我希望比较appleApple时返回true。目前的情况如下:

"Apple" == "Apple"  # returns TRUE
"Apple" == "APPLE"  # returns FALSE
5个回答

299
你需要使用casecmp方法。如果两个字符串在不考虑大小写的情况下相等,它会返回0
str1.casecmp(str2) == 0

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

或者,您可以将两个字符串都转换为小写 (str.downcase),然后比较它们是否相等。


20
根据我的基准测试,casecmp 方法的速度至少是 downcase 方法的两倍。 - Jacob
85
casecmp:一个大小写不敏感比较的方法,这个名字真是太傻了吧! - Zabba
4
责备libc开发者:http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html - mu is too short
17
如果你喜欢使用文字,你可以将“== 0”替换为“zero?”。 - Andrew Grimm
3
如果你想使用Rubocop且不出现警告,正确的方法是使用"Apple".casecmp("APPLE").zero?。但个人而言,我喜欢下面Andres提供的答案,使用.casecmp? - 8bithero
显示剩余4条评论

60

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

这里有更多信息


6
这个方法的改进很不错,但这是我见过的最不“Ruby风格”的方法之一。用这个casecmp垃圾代码感觉像在使用Java。 - Joshua Pinter
1
我真诚地建议您使用 "aBcDeF".downcase == "abcdef"。这样更易读,并且在 Ruby 2.4+ 中使用 casecmp 的性能优势被消除了。 - Joshua Pinter
1
等一下,对于这样的 API,“false”和“nil”之间有什么区别呢? - Hakanai
根据文档,在other_str不是字符串时返回nil。 - ramblex

9
在您需要比较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

所以在2.4.0中,strcasecmp不起作用;然而,在没有active_support gem的情况下,可以手动比较UTF-8字符串:

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

7

对于ruby2.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

6

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

str1.casecmp(str2).zero?

这就是我的风格检查器告诉我的,我喜欢它,因为与直接比较0相比,它更清晰,特别是当嵌套了更复杂的条件时。 - Capt. Crunch
如上所述,casecmp可能会返回nil,当调用zero?时会引发NoMethodError。 - CaTs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接