web-dev-qa-db-fra.com

Comment comparer des chaînes en ignorant le cas

Je veux que Apple et Apple la comparaison soit true. Actuellement

"Apple" == "Apple"  # returns TRUE
"Apple" == "Apple"  # returns FALSE
162
Steven

Vous recherchez casecmp . Il retourne 0 si deux chaînes sont égales, sans distinction de casse.

str1.casecmp(str2) == 0

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

Alternativement, vous pouvez convertir les deux chaînes en minuscules ( str.downcase ) et comparez pour l'égalité.

261
molf

En Ruby 2.4.0 vous avez: casecmp?(other_str) → true, false, or nil

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

Ici vous avez plus d'informations

38
Andres

Si vous devez comparer des chaînes UTF-8 en ignorant les cas:

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

Cela fonctionne de cette façon dans Ruby 2.3.1 et les versions antérieures.

Pour une plus petite empreinte mémoire, vous pouvez choisir cherry string/multibyte:

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

Edit, Ruby 2.4.0:

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

Donc, casecmp ne fonctionne pas dans la version 2.4.0; Cependant en 2.4.0, on peut comparer les chaînes UTF-8 manuellement sans active_support gem:

>> str1.downcase == str2.downcase
=> true
8
Adobe

casecmp et zéro? are Ruby méthodes intégrées. casecmp renvoie 0 si deux chaînes sont égales, sans tenir compte de la casse et que zéro? recherche la valeur zéro (== 0)

str1.casecmp(str2).zero?
5
Sivalingam

Pour Ruby 2.4 fonctionne correctement casecmp? pour les chaînes utf-8 (mb_chars pas nécessaire):

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

mais casecmp ne fonctionne pas pour utf-8:

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