大文字と小文字を区別せずに文字列を比較する方法


回答:


273

あなたが探していcasecmpます。02つの文字列が等しい場合、大文字と小文字を区別せずに返されます。

str1.casecmp(str2) == 0

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

または、両方の文字列を小文字(str.downcase)に変換して、等しいかどうかを比較することもできます。


19
私のベンチマークから、casecmpはダウンケースメソッドの少なくとも2倍の速さでした
Jacob

77
casecmp:大文字と小文字区別する比較メソッドの愚かな名前?!
Zabba


17
あなたの言葉を使用してのような場合は、交換することができます== 0zero?
アンドリューグリム

3
Rubocopを使用する場合、文句を言わないための正しい方法は"Apple".casecmp("APPLE").zero?次のとおりです。しかし、個人的には、以下のアンドレスの回答が好きです.casecmp?
8bithero

45

ではRubyの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
メソッドへの良い改善ですが、これは私が今まで見た中で最も「ルビーに響く」メソッドの1つです。このcasecmpジャンクでJavaを使用しているように感じます。
Joshua Pinter

"aBcDeF".downcase == "abcdef"代わりに使用することを正直にお勧めします。casecmpRuby 2.4以降では、はるかに読みやすくなり、使用によるパフォーマンスの向上が排除されています。
Joshua Pinter

待って、このようなAPI falseとの違いは何でしょうかnil
Trejkaz

ドキュメントによると、other_strが文字列ではない場合、nilが返されます
ramblex '31

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

Ruby 2.3.1以前のバージョンでは、このように動作します。

メモリフットプリントを小さくするには、チェリーピックを使用できますstring/multibyte

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

Ruby 2.4.0を編集

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

したがってcasecmp、2.4.0 では機能しません。ただし、2.4.0では、active_supportgem なしでUTF-8文字列を手動で比較できます。

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

5

casecmpとゼロ?Rubyの組み込みメソッドです。2つの文字列が等しく、大文字と小文字を区別せず、ゼロの場合、casecmpは0を返しますか?ゼロ値(== 0)をチェックします

str1.casecmp(str2).zero?

それが私のスタイルチェッカーが私に言ったことであり0、特により複雑な条件でネストされている場合は、literalと比較するよりも明確であるため、私はそれが好きです。
Amos Shapira、2018年

5

Ruby 2.4がうまく動作する場合、casecmp?utf-8文字列の場合(mb_charsは不要):

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

しかし、casecmpはutf-8では機能しません。

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.