Comparar cadenas de Ruby independientemente del caso de la cadena


Necesito comprobar

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

En Ruby.

Necesito una comparación de cadenas, pero para que la comprobación no distinga entre mayúsculas y minúsculas.

Author: Aamir, 2010-05-16

4 answers

Estás buscando casecmp. Devuelve 0 si dos cadenas son iguales, sin distinguir entre mayúsculas y minúsculas.

str1.casecmp(str2) == 0

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

Alternativamente, puede convertir ambas cadenas a minúsculas (str.downcase) y comparar para la igualdad.

 236
Author: molf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 18:42:21

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

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

Aquí tienes más información

 22
Author: Andres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 19:37:04

En caso de que tenga que comparar cadenas UTF-8 ignorando case:

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

Funciona de esta manera en Ruby 2.3.1 y versiones anteriores.

Para una huella de memoria más pequeña, puede elegir string/multibyte:

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

Edit, Ruby 2.4.0:

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

Así que casecmp no funciona en 2.4.0; Sin embargo en 2.4.0 uno puede comparar cadenas UTF-8 manualmente sin active_support gema:

>> str1.downcase == str2.downcase
=> true
 7
Author: Adobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-14 15:10:36

Casecmp y cero? son métodos incorporados en ruby. casecmp devuelve 0 si dos cadenas son iguales, sin distinción de mayúsculas y cero? comprueba el valor cero (==0)

str1.casecmp(str2).zero?
 3
Author: Sivalingam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-03 13:41:42