Ruby字符串比较,无论字符串大小写

Ste*_*ven 165 ruby string string-comparison

我需要检查一下

"Apple" == "Apple"  # returns TRUE
"Apple" == "APPLE"  # returns FALSE
Run Code Online (Sandbox Code Playgroud)

在Ruby中.

我需要一个字符串比较,但检查不区分大小写.

mol*_*olf 264

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

str1.casecmp(str2) == 0

"Apple".casecmp("APPLE") == 0
#=> true
Run Code Online (Sandbox Code Playgroud)

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

  • `casecmp`:case-*in*-sensitive compare方法的愚蠢名称?! (75认同)
  • 在我的基准测试中,casecmp的速度至少是downcase方法的两倍 (19认同)
  • 如果你喜欢使用单词,你可以将`== 0`替换为'zero?` (17认同)
  • @Zabba:责怪libc人:http://pubs.opengroup.org/onlinepubs/9699919799/functions/strcasecmp.html (4认同)
  • 如果你使用Rubocop正确的方式,它不要抱怨是"苹果".casecmp("APPLE").零?`但我个人喜欢Andres回答下面,它使用`.casecmp?` (3认同)

And*_*res 40

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
Run Code Online (Sandbox Code Playgroud)

在这里你有更多的信息

  • 对方法的一个很好的改进,但这是我见过的最不“Ruby 听起来”的方法之一。感觉就像我正在使用 Java 与这个 `casecmp` 垃圾。 (5认同)

Ado*_*obe 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
Run Code Online (Sandbox Code Playgroud)

它在Ruby 2.3.1及更早版本中以这种方式工作.

对于更小的内存占用,您可以选择string/multibyte:

require 'active_support'
require 'active_support/core_ext/string/multibyte'
Run Code Online (Sandbox Code Playgroud)

编辑,Ruby 2.4.0:

>> str1.casecmp(str2) == 0
=> false
Run Code Online (Sandbox Code Playgroud)

所以casecmp在2.4.0中不起作用; 但是在2.4.0中,可以手动比较UTF-8字符串而不使用active_supportgem:

>> str1.downcase == str2.downcase
=> true
Run Code Online (Sandbox Code Playgroud)


Siv*_*gam 5

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

str1.casecmp(str2).zero?
Run Code Online (Sandbox Code Playgroud)


Ser*_*kij 5

对于 ruby​​ 2.4 工作正常casecmp?对于 utf-8 字符串(不需要 mb_chars):

2.4.1 :062 > '??????1'.casecmp?('??????1')
 => true
Run Code Online (Sandbox Code Playgroud)

但 casecmp 不适用于 utf-8:

2.4.1 :062 > '??????1'.casecmp('??????1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
Run Code Online (Sandbox Code Playgroud)