대소 문자를 무시하고 문자열을 비교하는 방법


171

내가 원하는 appleApple비교 될 수 있습니다 true. 현재

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

답변:


273

찾고 있습니다 casecmp. 0두 문자열이 대소 문자를 구분하지 않는 경우 반환 합니다.

str1.casecmp(str2) == 0

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

또는 두 문자열을 모두 소문자 ( str.downcase) 로 변환 하고 동등성을 비교할 수 있습니다.


19
내 벤치 마크에서 casecmp는 다운 케이스 방법보다 2 배 이상 빠릅니다.
Jacob

77
casecmp: 대소 문자 구분하는 비교 방법 의 어리석은 이름 ?!
Zabba


17
당신이 단어를 사용하여 좋아하는 경우에, 당신은을 대체 할 수 == 0zero?
앤드류 그림 형제

3
Rubocop를 사용하면 불만을 제기하지 않는 올바른 방법 "Apple".casecmp("APPLE").zero?이지만 개인적으로 아래의 Andres 답변을 사용합니다..casecmp?
8bithero

45

에서 루비 2.4.0 당신은 :casecmp?(other_str) → true, false, or nil

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

여기에 더 많은 정보가 있습니다


3
이 방법에 대한 개선이 이루어졌지만 이것은 내가 본 것 중 가장 "Ruby sounding"방법 중 하나입니다. 이 casecmp정크 와 함께 Java를 사용하고있는 것 같습니다 .
Joshua Pinter

솔직히 당신이 "aBcDeF".downcase == "abcdef"대신 사용 하는 것이 좋습니다 . casecmpRuby 2.4 이상에서는 훨씬 더 읽기 쉽고 성능이 향상 되었습니다.
Joshua Pinter

대기는 차이가 사이에 무엇을 것 false하고 nil...이 같은 API를위한
Trejkaz

other_str이 문자열이 아닌 때 반환되는 무기 호 워드 프로세서에 따르면
ramblex

8

대소 문자를 무시하고 UTF-8 문자열을 비교해야하는 경우 :

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

Ruby 2.3.1 및 이전 버전에서이 방식으로 작동합니다.

더 작은 메모리 풋 프린트를 위해 다음을 선택할 수 있습니다 string/multibyte.

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

Ruby 2.4.0 편집 :

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

따라서 casecmp2.4.0에서는 작동하지 않습니다. 그러나 2.4.0에서는 active_supportgem 없이 UTF-8 문자열을 수동으로 비교할 수 있습니다 .

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

5

casecmp와 0? 루비 내장 메소드입니다. casecmp는 두 문자열이 대소 문자를 구분하지 않고 0이면 0을 반환합니까? 0 값을 확인합니다 (== 0)

str1.casecmp(str2).zero?

그것이 내 스타일 검사기가 나에게 말한 것입니다 0. 특히 더 관련있는 조건으로 중첩 될 때 literal과 비교하는 것이 더 명확하기 때문에 좋아합니다 .
아모스 샤피 라

5

루비 2.4 작동 괜찮은 casecmp? utf-8 문자열의 경우 (mb_chars가 필요하지 않음) :

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

하지만 casecmp는 utf-8에서 작동하지 않습니다.

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.