2010-05-16 2 views
135

ho bisogno di verificare la presenza distringa Rubino confrontare a prescindere dal caso stringa

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

in Ruby.

Ho bisogno di un confronto tra stringhe, ma per il controllo non è sensibile al maiuscolo/minuscolo.

risposta

223

Stai cercando casecmp. Restituisce 0 se due stringhe sono uguali, case-insensitively.

str1.casecmp(str2) == 0 

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

In alternativa, è possibile convertire entrambe le stringhe in minuscolo (str.downcase) e confrontare per l'uguaglianza.

+0

Questo lavorato fantasticamente: D grazie mille – Steven

+18

Dai miei punti di riferimento casecmp è almeno due volte più veloce del metodo downcase – Jacob

+67

'casecmp': un nome stupido per un caso - * in * -sensibile metodo di confronto ?! – Zabba

5

Nel caso in cui si devono confrontare stringhe UTF-8 ignorando 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 i più piccoli ingombro di memoria è possibile scegliere ciliegia string/multibyte:

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

Modifica, Ruby 2.4.0:

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

Quindi casecmp non funziona in 2.4.0; Tuttavia, in 2.4.0 si può confrontare stringhe UTF-8 manualmente senza active_support gemma:

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

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

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

Here you have more info

0

casecmp e pari a zero ? sono metodi integrati rubino. casecmp restituisce 0 se due stringhe sono uguali, case-insensitively e zero? verifica la presenza di valore zero (== 0)

str1.casecmp(str2).zero?