Làm thế nào để so sánh các chuỗi bỏ qua trường hợp


171

Tôi muốn appleAppleso sánh để được true. Hiện tại

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

Câu trả lời:


273

Bạn đang tìm kiếm casecmp. Nó trả về 0nếu hai chuỗi bằng nhau, không phân biệt chữ hoa chữ thường.

str1.casecmp(str2) == 0

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

Ngoài ra, bạn có thể chuyển đổi cả hai chuỗi thành chữ thường ( str.downcase) và so sánh cho bằng.


19
Từ điểm chuẩn của tôi, casecmp nhanh hơn ít nhất hai lần so với phương pháp viết thường
Jacob

77
casecmp: Một tên ngớ ngẩn cho một đựng pin- trong phương pháp so sánh nhạy cảm với ?!
Zabba

4
@Zabba: Đổ lỗi cho người libc: pubs.opengroup.org/onlinepub/9699919799/fifts/ Kẻ
mu quá ngắn

17
Nếu bạn thích sử dụng các từ, bạn có thể thay thế == 0bằngzero?
Andrew Grimm

3
Nếu bạn sử dụng Rubocop, cách chính xác để nó không phàn nàn là "Apple".casecmp("APPLE").zero?Nhưng cá nhân tôi thích câu trả lời của Andres bên dưới, sử dụng.casecmp?
8bithero

45

Trong Ruby 2.4.0, bạn có:casecmp?(other_str) → true, false, or nil

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

Ở đây bạn có thêm thông tin


3
Một cải tiến tốt cho phương pháp nhưng đây là một trong những phương pháp "âm thanh Ruby" ít nhất tôi từng thấy. Cảm giác như tôi đang sử dụng Java với casecmprác này .
Joshua Pinter

Tôi thành thật khuyên bạn nên sử dụng "aBcDeF".downcase == "abcdef"thay thế. Dễ đọc hơn nhiều và hiệu suất sử dụng casecmpđược loại bỏ trong Ruby 2.4+.
Joshua Pinter

Đợi đã, sự khác biệt giữa falsenilcho một API như thế này ...
Trejkaz

Theo tài liệu nil được trả về khi other_str không phải là một chuỗi
ramblex

8

Trong trường hợp bạn phải so sánh trường hợp bỏ qua chuỗi 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

Nó hoạt động theo cách này trong Ruby 2.3.1 và các phiên bản trước đó.

Đối với dấu chân bộ nhớ nhỏ hơn, bạn có thể chọn cherry string/multibyte:

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

Chỉnh sửa , Ruby 2.4.0:

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

Vì vậy, casecmpkhông hoạt động trong 2.4.0; Tuy nhiên, trong 2.4.0, người ta có thể so sánh các chuỗi UTF-8 theo cách thủ công mà không cần active_supportgem:

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

5

casecmp và số không? là phương pháp sẵn có của ruby. casecmp trả về 0 nếu hai chuỗi bằng nhau, không phân biệt chữ hoa chữ thường và 0? kiểm tra giá trị 0 (== 0)

str1.casecmp(str2).zero?

Đó là những gì người kiểm tra phong cách của tôi nói với tôi, và tôi thích nó bởi vì nó rõ ràng hơn so với nghĩa đen 0, đặc biệt là khi được lồng với một điều kiện liên quan nhiều hơn.
Amos Shapira

5

Đối với ruby ​​2.4 làm việc tốt casecmp? cho chuỗi utf-8 (không cần mb_chars):

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

nhưng casecmp không hoạt động cho utf-8:

2.4.1 :062 > 'строка1'.casecmp('СтроКА1')
 => 1
2.4.1 :063 > 'string1'.casecmp('StrInG1')
 => 0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.