Bagaimana membandingkan string yang mengabaikan case

171

Saya ingin appledan Appleperbandingan menjadi true. Saat ini

"Apple" == "Apple"  # returns TRUE
"Apple" == "APPLE"  # returns FALSE
Steven
sumber

Jawaban:

273

Anda sedang mencari casecmp. Ia mengembalikan 0jika dua string sama, case-insensitive.

str1.casecmp(str2) == 0

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

Atau, Anda dapat mengonversi kedua string menjadi huruf kecil ( str.downcase) dan membandingkan untuk persamaan.

Molf
sumber
19
Dari benchmark saya, casecmp setidaknya dua kali lebih cepat dari metode downcase
Yakub
77
casecmp: nama konyol untuk metode perbandingan case- in -sensitive ?!
Zabba
4
@Zabba: Salahkan orang libc: pubs.opengroup.org/onlinepubs/9699919799/functions/…
mu terlalu pendek
17
Jika Anda suka menggunakan kata-kata, Anda dapat menggantinya == 0denganzero?
Andrew Grimm
3
Jika Anda menggunakan Rubocop cara yang benar untuk tidak mengeluh adalah "Apple".casecmp("APPLE").zero?Tapi secara pribadi saya suka jawaban Andres di bawah ini, yang menggunakan.casecmp?
8bithero
45

Di Ruby 2.4.0 Anda memiliki:casecmp?(other_str) → true, false, or nil

"abcdef".casecmp?("abcde")     #=> false
"aBcDeF".casecmp?("abcdef")    #=> true
"abcdef".casecmp?("abcdefg")   #=> false
"abcdef".casecmp?("ABCDEF")    #=> true

Di sini Anda memiliki info lebih lanjut

Andres
sumber
3
Peningkatan yang baik untuk metode ini tetapi ini adalah salah satu metode "Ruby terdengar" yang paling sedikit yang pernah saya lihat. Terasa seperti saya menggunakan Java dengan casecmpsampah ini .
Joshua Pinter
Sejujurnya saya menyarankan Anda menggunakan "aBcDeF".downcase == "abcdef". Jauh lebih mudah dibaca dan keuntungan kinerja menggunakan casecmpdihilangkan di Ruby 2.4+.
Joshua Pinter
Tunggu, apa bedanya antara falsedan niluntuk API seperti ini ...
Trejkaz
Menurut docs nil dikembalikan ketika other_str bukan string
ramblex
8

Jika Anda harus membandingkan string UTF-8 yang mengabaikan case:

>> 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

Ini berfungsi seperti ini di Ruby 2.3.1 dan versi sebelumnya.

Untuk jejak memori yang lebih kecil, Anda dapat memilih string/multibyte:

require 'active_support'
require 'active_support/core_ext/string/multibyte'

Edit , Ruby 2.4.0:

>> str1.casecmp(str2) == 0
=> false

Jadi casecmptidak berfungsi di 2.4.0; Namun dalam 2.4.0 orang dapat membandingkan string UTF-8 secara manual tanpa active_supportpermata:

>> str1.downcase == str2.downcase
=> true
Adobe
sumber
5

casecmp dan nol? adalah metode bawaan ruby. casecmp mengembalikan 0 jika dua string sama, case-insensitive dan nol? memeriksa nilai nol (== 0)

str1.casecmp(str2).zero?
Sivalingam
sumber
Itulah yang dikatakan pemeriksa gaya saya, dan saya menyukainya karena lebih jelas daripada membandingkan dengan literal 0, terutama ketika bersarang dengan kondisi yang lebih terlibat.
Amos Shapira
5

Untuk ruby ​​2.4 berfungsi dengan baik casecmp? untuk utf-8 strings (mb_chars tidak diperlukan):

2.4.1 :062 > 'строка1'.casecmp?('СтроКа1')
 => true

tapi casecmp tidak bekerja untuk utf-8:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
Sergio Belevskij
sumber