วิธีเปรียบเทียบสตริงโดยไม่สนใจขนาดตัวพิมพ์


คำตอบ:


273

casecmpคุณกำลังมองหา มันจะส่งกลับ0ถ้าทั้งสองสตริงมีความเท่าเทียมกัน

str1.casecmp(str2) == 0

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

หรือคุณสามารถแปลงทั้งสองสตริงเป็นตัวพิมพ์เล็ก ( str.downcase) และเปรียบเทียบเพื่อความเท่าเทียมกัน


19
จากเกณฑ์มาตรฐาน casecmp ของฉันเร็วอย่างน้อยสองเท่าของวิธีดาวน์case
Jacob

77
casecmp: ชื่อโง่สำหรับวิธีเปรียบเทียบแบบ case- in -sensitive
Zabba


17
หากคุณชอบการใช้คำคุณสามารถแทนที่== 0ด้วยzero?
Andrew Grimm

3
หากคุณใช้ Rubocop วิธีที่ถูกต้องสำหรับที่จะไม่บ่นคือ"Apple".casecmp("APPLE").zero?แต่โดยส่วนตัวแล้วฉันชอบคำตอบของ Andres ด้านล่างซึ่งใช้.casecmp?
8bithero

45

ในRuby 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
เป็นการปรับปรุงวิธีการที่ดี แต่นี่เป็นหนึ่งในวิธีการ "ทำให้เกิดเสียงทับทิมน้อยที่สุด" ที่ฉันเคยเห็น รู้สึกเหมือนฉันกำลังใช้ Java กับcasecmpขยะนี้
Joshua Pinter

ฉันขอแนะนำให้คุณใช้"aBcDeF".downcase == "abcdef"แทน สามารถอ่านได้มากขึ้นและประสิทธิภาพที่เพิ่มขึ้นของการใช้casecmpจะถูกกำจัดใน Ruby 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

ดังนั้นcasecmpใช้งานไม่ได้ใน 2.4.0; อย่างไรก็ตามใน 2.4.0 หนึ่งสามารถเปรียบเทียบสตริง UTF-8 ด้วยตนเองโดยไม่ต้องactive_supportอัญมณี:

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

5

casecmp และศูนย์? เป็นวิธีการ inbuilt ทับทิม casecmp ส่งคืนค่า 0 หากสองสตริงมีค่าเท่ากันตัวพิมพ์เล็กและใหญ่เป็นศูนย์? ตรวจสอบค่าศูนย์ (== 0)

str1.casecmp(str2).zero?

นั่นคือสิ่งที่ตัวตรวจสอบสไตล์ของฉันบอกฉันและฉันชอบเพราะมันชัดเจนกว่าการเปรียบเทียบกับตัวอักษร0โดยเฉพาะอย่างยิ่งเมื่อซ้อนกับเงื่อนไขที่เกี่ยวข้องมากกว่า
Amos Shapira

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.