Як порівняти рядки, ігноруючи випадок


Відповіді:


273

Ви шукаєте casecmp. Він повертається, 0якщо два рядки рівні, без регістру.

str1.casecmp(str2) == 0

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

Крім того, ви можете перетворити обидва рядки в малі регістри ( str.downcase) і порівняти для рівності.


19
З моїх орієнтирів casecmp принаймні удвічі швидший за нижній метод
Яків

77
casecmp: Дурне назву для прецедентного в , чутливого порівняти метод?!
Забба

4
@Zabba: Звинувачуйте людей, що займаються libc: pubs.opengroup.org/onlinepubs/9699919799/functions/…
занадто короткий

17
Якщо вам подобається з допомогою слів, ви можете замінити == 0зzero?
Andrew Grimm

3
Якщо ви використовуєте Rubocop правильним способом, щоб не скаржитися, "Apple".casecmp("APPLE").zero?але особисто мені подобається відповідь Андреса нижче, яка використовує.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мотлохом.
Джошуа Пінтер

Я б чесно запропонував вам скористатися "aBcDeF".downcase == "abcdef"натомість. Набагато більш читабельні та підвищення продуктивності від використання casecmpусуваються в Ruby 2.4+.
Джошуа Пінтер

Зачекайте, що буде різниця між бути 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 і нуль? вбудовані методи рубіну. casecmp повертає 0, якщо два рядки рівні, регістр без чутливості та нуль? перевіряє нульове значення (== 0)

str1.casecmp(str2).zero?

Ось що мені сказала моя перевірка стилів, і мені це подобається, тому що вона зрозуміліша, ніж порівняння з буквальним 0, особливо, коли вкладено з більш привабливою умовою.
Амос Шапіра

5

Для ruby ​​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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.