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

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.


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


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

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?

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.