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

问题描述 投票:159回答:5

我希望appleApple比较为true。目前

"Apple" == "Apple"  # returns TRUE
"Apple" == "APPLE"  # returns FALSE
ruby string string-comparison
5个回答
259
投票

你在找casecmp。如果两个字符串相等,则返回0,不区分大小写。

str1.casecmp(str2) == 0

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

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


36
投票

在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

Here you have more info


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_support gem的情况下手动比较UTF-8字符串:

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

5
投票

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

str1.casecmp(str2).zero?

1
投票

对于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
© www.soinside.com 2019 - 2024. All rights reserved.