【问题标题】:How to compare strings ignoring the case如何在忽略大小写的情况下比较字符串
【发布时间】:2011-02-20 03:09:54
【问题描述】:

我希望 appleApple 比较为 true。 目前

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

【问题讨论】:

    标签: ruby string string-comparison


    【解决方案1】:

    您正在寻找casecmp。如果两个字符串相等,则返回0,不区分大小写。

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

    或者,您可以将两个字符串都转换为小写 (str.downcase) 并比较是否相等。

    【讨论】:

    • 从我的基准测试来看,casecmp 至少是 downcase 方法的两倍
    • casecmp: 一个区分大小写的傻名字 - in - 敏感的比较方法?!
    • 如果你喜欢用词,可以把== 0换成zero?
    • 如果你使用 Rubocop 不抱怨的正确方法是 "Apple".casecmp("APPLE").zero? 但我个人喜欢 Andres 下面的回答,它使用 .casecmp?
    【解决方案2】:

    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
    

    Here you have more info

    【讨论】:

    • 对方法的一个很好的改进,但这是我见过的最不“像 Ruby 发声”的方法之一。感觉就像我正在使用 Java 处理这个 casecmp 垃圾。
    • 老实说,我建议您改用"aBcDeF".downcase == "abcdef"。在 Ruby 2.4+ 中消除了使用 casecmp 的可读性和性能提升。
    • 等等,对于这样的 API,falsenil 有什么区别...
    • 根据文档,当 other_str 不是字符串时返回 nil
    【解决方案3】:

    如果您必须比较忽略大小写的 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 gem:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        casecmp 和零?是 ruby​​ 内置的方法。如果两个字符串相等,不区分大小写且为零,casecmp 返回 0?检查零值 (==0)

        str1.casecmp(str2).zero?
        

        【讨论】:

        • 这是我的样式检查器告诉我的,我喜欢它,因为它比与文字 0 相比更清晰,尤其是在嵌套更复杂的条件时。
        • 如上所述,casecmp 可以返回 nil,这会在调用 zero? 时引发 NoMethodError
        猜你喜欢
        • 1970-01-01
        • 2016-01-29
        • 2020-12-31
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多