मामले की अनदेखी करने वाले तार की तुलना कैसे करें


171

मैं चाहता हूं appleऔर Appleतुलना करना चाहता हूं true। वर्तमान में

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

जवाबों:


273

तुम खोज रहे हो casecmp। यह रिटर्न 0अगर दो तार के बराबर हैं, केस-insensitively।

str1.casecmp(str2) == 0

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

वैकल्पिक रूप से, आप दोनों तारों को निचले मामले में बदल सकते हैं ( str.downcase) और समानता के लिए तुलना कर सकते हैं ।


19
मेरे बेंचमार्क से कासेम्प नीचे की विधि के रूप में कम से कम दो बार तेज है
याकूब

77
casecmp: एक केस के लिए एक मूर्खतापूर्ण नाम में संवेदनशील तुलना विधि ?!
ज़ब्बा 16

4
@ ज़ब्बा: परिवाद लोगों को दोष दें: pubs.opengroup.org/onlinepubs/9699919799/functions/…
mu बहुत छोटा है

17
यदि आप शब्दों का उपयोग करना पसंद करते हैं, तो आप इसके == 0साथzero?
एंड्रयू ग्रिम

3
यदि आप रूबोक का उपयोग करते हैं तो इसके लिए शिकायत न करने का सही तरीका है, "Apple".casecmp("APPLE").zero?लेकिन व्यक्तिगत रूप से मुझे एंड्रेस का जवाब पसंद है, जो उपयोग करता है.casecmp?
8bithero

45

में रूबी 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

यहाँ आपके पास अधिक जानकारी है


3
विधि में एक अच्छा सुधार लेकिन यह मैंने कभी देखा है कम से कम "रूबी लग" विधियों में से एक है। ऐसा लगता है कि मैं इस casecmpकबाड़ के साथ जावा का उपयोग कर रहा हूं ।
जोशुआ पिन्टर

मैं ईमानदारी से सुझाव देता हूं कि आप "aBcDeF".downcase == "abcdef"इसके बजाय उपयोग करें । बहुत अधिक पठनीय और उपयोग के प्रदर्शन लाभ casecmpरूबी 2.4+ में समाप्त हो गए हैं।
यहोशू पिंजर

रुको, इस तरह एक एपीआई के बीच falseऔर अंतर क्या होगा nil...
ट्रेकजाज़

डॉक्स शून्य जब other_str एक स्ट्रिंग नहीं है लौटा दिया जाता है के अनुसार
ramblex

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

यह रूबी 2.3.1 और पुराने संस्करणों में इस तरह से काम करता है।

छोटे स्मृति पदचिह्न के लिए आप चेरी चुन सकते हैं string/multibyte:

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

संपादित करें , रूबी 2.4.0:

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

तो casecmp2.4.0 में काम नहीं करता है; हालांकि 2.4.0 में कोई भी यूटीएफ -8 तार की तुलना बिना active_supportरत्न के स्वयं कर सकता है :

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

5

किस्सपैक और शून्य? रूबी इनबिल्ट तरीके हैं। यदि दो तार बराबर, केस-असंवेदनशील और शून्य हैं, तो केसकैंप 0 देता है? शून्य मान के लिए जांच (== 0)

str1.casecmp(str2).zero?

यही मेरे स्टाइल चेकर ने मुझे बताया, और मुझे यह पसंद है क्योंकि यह शाब्दिक के साथ तुलना करने की तुलना में स्पष्ट है 0, खासकर जब एक अधिक सम्मिलित स्थिति के साथ नेस्टेड हो।
आमोस शापिरा

5

रूबी 2.4 के लिए ठीक कासेकैंप काम कर रहा है ? utf-8 स्ट्रिंग्स के लिए (mb_chars की आवश्यकता नहीं):

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

लेकिन casec utf-8 के लिए काम नहीं कर रहा है:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.