So vergleichen Sie Zeichenfolgen, bei denen der Fall ignoriert wird

171

Ich möchte appleund AppleVergleich sein true. Zur Zeit

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

Antworten:

273

Du suchst casecmp. Es wird zurückgegeben, 0wenn zwei Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung gleich sind.

str1.casecmp(str2) == 0

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

Alternativ können Sie beide Zeichenfolgen in Kleinbuchstaben ( str.downcase) konvertieren und auf Gleichheit vergleichen.

molf
quelle
19
Nach meinen Benchmarks ist casecmp mindestens doppelt so schnell wie die Downcase-Methode
Jacob
77
casecmp: Ein dummer Name für eine Vergleichsmethode, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird?!
Zabba
4
@ Zabba: Beschuldigen Sie die libc Leute: pubs.opengroup.org/onlinepubs/9699919799/functions/…
mu ist zu kurz
17
Wenn Sie gerne Wörter verwenden, können Sie die == 0durchzero?
Andrew Grimm
3
Wenn Sie Rubocop verwenden, ist der richtige Weg, sich nicht zu beschweren, "Apple".casecmp("APPLE").zero?aber ich persönlich mag Andres Antwort unten, die verwendet.casecmp?
8bithero
45

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

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

Hier haben Sie weitere Informationen

Andres
quelle
3
Eine gute Verbesserung der Methode, aber dies ist eine der am wenigsten "Ruby klingenden" Methoden, die ich je gesehen habe. Es fühlt sich an, als würde ich Java mit diesem casecmpMüll verwenden.
Joshua Pinter
Ich würde ehrlich vorschlagen, dass Sie "aBcDeF".downcase == "abcdef"stattdessen verwenden. casecmpIn Ruby 2.4+ sind viel besser lesbar und die Leistungssteigerungen bei der Verwendung entfallen.
Joshua Pinter
Warten Sie, was wäre der Unterschied zwischen falseund nilfür eine API wie diese ...
Trejkaz
Laut den Dokumenten wird nil zurückgegeben, wenn other_str kein String ist
Ramblex
8

Falls Sie UTF-8-Zeichenfolgen vergleichen müssen, ohne die Groß- und Kleinschreibung zu beachten:

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

Dies funktioniert in Ruby 2.3.1 und früheren Versionen auf diese Weise.

Für einen geringeren Speicherbedarf können Sie Folgendes auswählen string/multibyte:

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

Bearbeiten , Ruby 2.4.0:

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

Funktioniert casecmpalso nicht in 2.4.0; In 2.4.0 kann man UTF-8-Strings jedoch manuell ohne active_supportGem vergleichen:

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

casecmp und null? sind rubinrote Methoden. casecmp gibt 0 zurück, wenn zwei Zeichenfolgen gleich sind, ohne Berücksichtigung der Groß- und Kleinschreibung und Null? prüft auf Nullwert (== 0)

str1.casecmp(str2).zero?
Sivalingam
quelle
Das hat mir mein Style Checker gesagt, und ich mag es, weil es klarer ist als ein Vergleich mit Literal 0, besonders wenn es mit einer komplexeren Bedingung verschachtelt ist.
Amos Shapira
5

Für Ruby 2.4 funktioniert feines Casecmp? für utf-8-Strings (mb_chars nicht erforderlich):

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

aber casecmp funktioniert nicht für utf-8:

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