Davayı görmezden gelen dizeler nasıl karşılaştırılır


171

İstediğim appleve Applekarşılaştırma olması true. Şu anda

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

Yanıtlar:


273

Arıyorsunuz casecmp. 0İki dize eşit olursa, büyük / küçük harfe duyarlı değilse döndürür .

str1.casecmp(str2) == 0

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

Alternatif olarak, her iki dizeyi de küçük harfe ( str.downcase) dönüştürebilir ve eşitlikle karşılaştırabilirsiniz.


19
Benim ölçütlerimden casecmp, downcase yönteminin en az iki katıdır
Jacob

77
casecmp: Bir vakadan- için saçma isim de -duyarlı karşılaştırmak yöntemle ?!
Zabba


17
Eğer kelimeleri kullanarak sever varsa, yerine == 0ilezero?
Andrew Grimm

3
Eğer şikayet etmemek için doğru yolu Rubocop kullanırsanız "Apple".casecmp("APPLE").zero?Ama şahsen Andres cevap aşağıdaki gibi kullanır.casecmp?
8bithero

45

In Ruby 2.4.0 sahip:casecmp?(other_str) → true, false, or nil

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

Burada daha fazla bilgi var


3
Yöntem iyi bir gelişme ama şimdiye kadar gördüğüm en az "Ruby sondaj" yöntemlerinden biridir. Bu casecmpgereksiz dosyayla Java kullanıyorum .
Joshua Pinter

Dürüstçe "aBcDeF".downcase == "abcdef"bunun yerine kullanmanızı öneririm . Çok daha kolay okunabilir ve performans artışı casecmpRuby 2.4+ 'de kaldırılmıştır.
Joshua Pinter

Bekle, böyle bir API için falseve bunun arasındaki fark ne olurdu nil...
Trejkaz

Belgelere göre, other_str bir string olmadığında sıfır döndürülür
ramblex

8

UTF-8 dizelerini görmezden gelmeniz durumunda:

>> 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 ve önceki sürümlerinde bu şekilde çalışır.

Daha az bellek alanı için kiraz seçimini yapabilirsiniz string/multibyte:

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

Düzenle , Ruby 2.4.0:

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

Yani casecmp2.4.0'da çalışmıyor; Ancak 2.4.0'da UTF-8 dizelerini taşsız manuel olarak karşılaştırabiliriz active_support:

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

5

casecmp ve sıfır? yakut dahili yöntemlerdir. iki dize eşit, büyük / küçük harfe duyarsız ve sıfırsa casecmp 0 değerini döndürür? sıfır değerini kontrol eder (== 0)

str1.casecmp(str2).zero?

Stil denetleyicimin bana söylediği şey bu ve bunu seviyorum çünkü 0özellikle daha ilgili bir durumla iç içe olduğunda, kelimenin tam anlamıyla karşılaştırmaktan daha net .
Amos Shapira

5

Ruby 2.4 için iyi çalışıyor casecmp? utf-8 dizeleri için (mb_chars gerekli değildir):

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

ancak casecmp utf-8 için çalışmaz:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.