Come confrontare le stringhe ignorando il caso


171

Voglio applee Appleconfronto essere true. Attualmente

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

Risposte:


273

Stai cercando casecmp. Restituisce 0se due stringhe sono uguali, senza distinzione tra maiuscole e minuscole.

str1.casecmp(str2) == 0

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

In alternativa, puoi convertire entrambe le stringhe in lettere minuscole ( str.downcase) e confrontarle per l'uguaglianza.


19
Dai miei benchmark casecmp è almeno due volte più veloce del metodo downcase
Jacob

77
casecmp: un nome sciocco per un metodo di confronto case- in- sensibile ?!
Zabba,


17
Se ti piace usare le parole, puoi sostituirlo == 0conzero?
Andrew Grimm,

3
Se usi Rubocop nel modo giusto per non lamentarti è "Apple".casecmp("APPLE").zero?Ma personalmente mi piace la risposta di Andres qui sotto, che usa.casecmp?
8bithero

45

In Ruby 2.4.0 hai:casecmp?(other_str) → true, false, or nil

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

Qui hai maggiori informazioni


3
Un buon miglioramento del metodo, ma questo è uno dei metodi "Ruby sounding" che abbia mai visto. Mi sembra di usare Java con questa casecmpspazzatura.
Joshua Pinter

Onestamente suggerirei di usare "aBcDeF".downcase == "abcdef"invece. Molto più leggibile e i vantaggi in termini di prestazioni dell'utilizzo casecmpsono eliminati in Ruby 2.4+.
Joshua Pinter

Aspetta, quale sarebbe la differenza tra falsee nilper un'API come questa ...
Trejkaz,

Secondo i documenti, viene restituito zero quando other_str non è una stringa
ramblex

8

Nel caso in cui devi confrontare le stringhe UTF-8 ignorando il caso:

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

Funziona in questo modo in Ruby 2.3.1 e versioni precedenti.

Per un ingombro di memoria ridotto, puoi scegliere string/multibyte:

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

Modifica , Ruby 2.4.0:

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

Quindi casecmpnon funziona in 2.4.0; Tuttavia in 2.4.0 si possono confrontare manualmente le stringhe UTF-8 senza active_supportgem:

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

5

casecmp e zero? sono metodi integrati rubino. casecmp restituisce 0 se due stringhe sono uguali, senza distinzione tra maiuscole e minuscole e zero? verifica il valore zero (== 0)

str1.casecmp(str2).zero?

Questo è ciò che mi ha detto il mio correttore di stile, e mi piace perché è più chiaro rispetto al confronto letterale 0, specialmente quando nidificato con una condizione più coinvolta.
Amos Shapira,

5

Per ruby ​​2.4 funziona bene casecmp? per stringhe utf-8 (mb_chars non necessario):

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

ma casecmp non funziona con utf-8:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.