Cómo comparar cadenas ignorando el caso


171

Quiero appley Applecomparación para ser true. Actualmente

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

Respuestas:


273

Usted está buscando casecmp. Regresa 0si dos cadenas son iguales, sin distinción 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 igualdad.


19
Desde mis puntos de referencia, casecmp es al menos dos veces más rápido que el método de mayúsculas y minúsculas
Jacob,

77
casecmp: ¿un nombre tonto para un método de comparación caso- en- sensible?
Zabba

44
@Zabba: Culpe a la gente de la biblioteca
mu es demasiado corto

17
Si te gusta usar palabras, puedes reemplazarlas == 0conzero?
Andrew Grimm

3
Si usa Rubocop, la forma correcta para que no se queje es "Apple".casecmp("APPLE").zero?Pero personalmente me gusta que Andrés responda a continuación, que usa.casecmp?
8bithero

45

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


3
Una buena mejora para el método, pero este es uno de los menos métodos de "sonar rubí" que he visto. Parece que estoy usando Java con esta casecmpbasura.
Joshua Pinter el

Sinceramente, te sugiero que uses "aBcDeF".downcase == "abcdef"en su lugar. Mucho más legible y las ganancias de rendimiento del uso casecmpse eliminan en Ruby 2.4+.
Joshua Pinter

Espera, ¿cuál sería la diferencia entre falsey nilpara una API como esta ...
Trejkaz

Según los documentos, se devuelve nil cuando other_str no es una cadena
ramblex

8

En caso de que tenga que comparar cadenas UTF-8 ignorando mayúsculas y minúsculas:

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

Editar , Ruby 2.4.0:

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

Entonces casecmpno funciona en 2.4.0; Sin embargo, en 2.4.0 se pueden comparar cadenas UTF-8 manualmente sin active_supportgemas:

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

5

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

str1.casecmp(str2).zero?

Eso es lo que me dijo mi comprobador de estilo, y me gusta porque es más claro que compararlo con el literal 0, especialmente cuando está anidado con una condición más complicada.
Amos Shapira

5

¿Para ruby ​​2.4 funciona bien casecmp? para cadenas utf-8 (no se necesitan mb_chars):

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

pero casecmp no funciona para utf-8:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.