【问题标题】:How to compare two strings ignoring case in Swift language?如何在 Swift 语言中比较两个忽略大小写的字符串?
【发布时间】:2023-04-10 05:54:01
【问题描述】:

我们如何在忽略大小写的情况下比较两个字符串? 例如:

var a = "Cash"
var b = "cash"

如果我们比较 var a 和 var b,是否有任何方法会返回 true

【问题讨论】:

  • 您可以在比较之前将两者都转换为小写。
  • 请注意,某些答案中提到的lowercaseString 在某些语言中会失败(例如 Straße != STRASSE)
  • @Alladinian 你建议怎么做呢。解决此问题的大多数示例都显示转换为全部大写或全部小写?
  • @Steve Apple 建议改用 caseInsensitiveCompare:localizedCaseInsensitiveCompare:
  • @Steve 当然! (你可以试试"Straße".localizedCaseInsensitiveCompare("STRASSE") - 记得导入Foundation

标签: ios swift string


【解决方案1】:

试试这个:

var a = "Cash"
var b = "cash"
let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)

// You can also ignore last two parameters(thanks 0x7fffffff)
//let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch)

result 是 NSComparisonResult 枚举的类型:

enum NSComparisonResult : Int {

    case OrderedAscending
    case OrderedSame
    case OrderedDescending
}

所以你可以使用 if 语句:

if result == .OrderedSame {
    println("equal")
} else {
    println("not equal")
}

【讨论】:

  • 如果我没记错的话,范围和语言环境参数是可选的,可以完全省略。
  • 是的,我想展示带有所有参数的整个方法。
  • 你应该在这里得到正确的答案。比较字符串不仅仅是知道它们是否相等
【解决方案2】:

可以自己动手:

func equalIgnoringCase(a:String, b:String) -> Bool {
    return a.lowercaseString == b.lowercaseString
}

【讨论】:

  • 转换大小写再比较是错误的。请参阅问题下的 cmets。
【解决方案3】:
if a.lowercaseString == b.lowercaseString {
    //Strings match
}

【讨论】:

  • Pure Swift 是这里的最佳选择。不需要基础。
  • 转换大小写再比较是错误的。请参阅问题下的 cmets。
  • @JimBalter 我不会说这是“错误的”,因为它回答了 OP 问题中给出的示例。对于我们这些不需要支持本地化的人来说,这要干净得多!
  • ^ 不,这是错误的。对于一个例子来说,发生某种事情是无关紧要的。这个黑客根本不是“更干净”的。接受的答案给出了正确、干净的解决方案。
【解决方案4】:

你也可以把所有的字母变成大写(或小写),看看它们是否相同。

var a = “Cash”
var b = “CASh”

if a.uppercaseString == b.uppercaseString{
  //DO SOMETHING
}

这将使两个变量都为”CASH”,因此它们是相等的。

你也可以做一个String 扩展

extension String{
  func equalsIgnoreCase(string:String) -> Bool{
    return self.uppercaseString == string.uppercaseString
  }
}

if "Something ELSE".equalsIgnoreCase("something Else"){
  print("TRUE")
}

【讨论】:

  • 转换大小写再比较是错误的。请参阅问题下的 cmets。
【解决方案5】:

使用caseInsensitiveCompare方法:

let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"

ComparisonResult 告诉您按字典顺序哪个单词先于另一个单词(即哪个单词更靠近字典的前面)。 .orderedSame 表示字符串最终会出现在字典中的同一位置

【讨论】:

  • .orderedSame 是什么意思? docs 只是说两个操作数相等。但是为什么在这里使用“订单”这个词呢?有顺序还是什么? 左操作数小于右操作数。 (.orderedAscending) 对字符串意味着什么
  • @Honey 比较结果会告诉您按字典顺序哪个单词先于另一个单词(即哪个单词更靠近字典的前面)。 .orderedSame 表示字符串最终会出现在字典中的同一位置。
  • @Honey .orderedSameComparisonResult.orderSame 的缩写 ...您不必命名类型,因为编译器知道 caseInsensitiveCompare 返回 ComparisonResult。 “两个操作数相等”——根据特定的顺序它们相等……显然,“Cash”和“cash”不是相同的字符串值。 “可是这里为什么要用‘秩序’这个词呢?” -- 因为它是有序比较的结果。其他值是orderedAscendingorderedDescending ...这不仅仅是相同或不同的问题。至于“更小”:字符串就像大基数中的数字。
  • 我觉得这是糟糕的 API 设计。签名不容易阅读...让它a.caseInsensitiveCompare(b, comparing: .orderedSame) 会更具可读性...
【解决方案6】:

试试这个:

对于较旧的 swift:

var a : String = "Cash"
var b : String = "cash"

if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){
    println("Et voila")
}

斯威夫特 3+

var a : String = "Cash"
var b : String = "cash"
    
if(a.caseInsensitiveCompare(b) == .orderedSame){
    print("Et voila")
}

【讨论】:

  • 在 Swift 3 中你需要使用a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
  • 注意:caseInsensitiveCompare(_:) 不包含在 Swift 标准库中,而是Foundation 框架的一部分,因此需要import Foundation
  • 有什么理由比a.lowercased() == b.lowercased()更好吗?
  • @jowie 如其他 cmets 所述,在某些语言上使用 lower/uppercased() 可能会失败。
【解决方案7】:

斯威夫特 3

if a.lowercased() == b.lowercased() {

}

【讨论】:

  • 这是错误的。请参阅问题下的 cmets。
【解决方案8】:

Swift 3:您可以定义自己的运算符,例如~=.

infix operator ~=

func ~=(lhs: String, rhs: String) -> Bool {
   return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}

然后你可以在操场上尝试

let low = "hej"
let up = "Hej"

func test() {
    if low ~= up {
        print("same")
    } else {
        print("not same")
    }
}

test() // prints 'same'

【讨论】:

  • 我没有对此投反对票,但请注意,这通常是一个非常糟糕的主意,因为上面的自定义模式匹配运算符将优先于将String 实例匹配到时通常使用的本机模式匹配彼此(或其他 String 文字)。想象let str = "isCAMELcase"被切换,情况如下:case "IsCamelCase": ... 。使用上面的方法,这个case 将被成功输入,这不是来自String 模式匹配的标准库实现的预期。更新后的 Swift 3 答案仍然很好,但是 ...
  • ...考虑使用自定义函数(或String 扩展名)作为上述帮助程序,而不是覆盖默认的String 模式匹配。
【解决方案9】:

斯威夫特 3:

你也可以在两个字符串函数之间使用本地化不区分大小写的比较,它返回Bool

var a = "cash"
var b = "Cash"

if a.localizedCaseInsensitiveContains(b) {
    print("Identical")           
} else {
    print("Non Identical")
}

【讨论】:

  • 您的解决方案不正确。考虑字符串“casha”和“Cash”
【解决方案10】:

正确方法:

let a: String = "Cash"
let b: String = "cash"

if a.caseInsensitiveCompare(b) == .orderedSame {
    //Strings match 
}

请注意:ComparisonResult.orderedSame 也可以简写为 .orderedSame。

其他方式:

一个。

if a.lowercased() == b.lowercased() {
    //Strings match 
}

b.

if a.uppercased() == b.uppercased() {
    //Strings match 
}

c.

if a.capitalized() == b.capitalized() {
    //Strings match 
}

【讨论】:

    【解决方案11】:
    extension String
    {
        func equalIgnoreCase(_ compare:String) -> Bool
        {
            return self.uppercased() == compare.uppercased()
        }
    }
    

    使用示例

    print("lala".equalIgnoreCase("LALA"))
    print("l4la".equalIgnoreCase("LALA"))
    print("laLa".equalIgnoreCase("LALA"))
    print("LALa".equalIgnoreCase("LALA"))
    

    【讨论】:

    • 这不适用于某些语言中的某些字符串...请参阅问题下的 cmets 以及许多正确答案,其中一些 - 包括已接受的答案 - 在您之前多年.
    【解决方案12】:

    Swift 4,我使用 caseInsensitiveCompare() 作为模板进行了字符串扩展路由(但允许操作数是可选的)。这是我用来组合它的游乐场(Swift 新手,因此欢迎提供反馈)。

    import UIKit
    
    extension String {
        func caseInsensitiveEquals<T>(_ otherString: T?) -> Bool where T : StringProtocol {
            guard let otherString = otherString else {
                return false
            }
            return self.caseInsensitiveCompare(otherString) == ComparisonResult.orderedSame
        }
    }
    
    "string 1".caseInsensitiveEquals("string 2") // false
    
    "thingy".caseInsensitiveEquals("thingy") // true
    
    let nilString1: String? = nil
    "woohoo".caseInsensitiveEquals(nilString1) // false
    

    【讨论】:

    • 您可以只使用.orderedSame 而不是ComparisonResult.orderedSame
    【解决方案13】:

    localizedCaseInsensitiveContains:通过执行不区分大小写、区域设置感知的搜索,返回接收者是否包含给定字符串

    if a.localizedCaseInsensitiveContains(b) {
        //returns true if a contains b (case insensitive)
    }
    

    已编辑

    caseInsensitiveCompare :返回以 NSCaseInsensitiveSearch 作为唯一选项调用 compare(_:options:) 的结果。

    if a.caseInsensitiveCompare(b) == .orderedSame {
        //returns true if a equals b (case insensitive)
    }
    

    【讨论】:

    • 问题是比较,而不是遏制。
    • 如果 "a 包含 b""b 包含 a",它们是相等的。所以这肯定是一个可能的解决方案,即使它可能不是最有效的解决方案。
    【解决方案14】:

    电话号码比较示例;使用 Swift 4.2

    var selectPhone = [String]()
    
    if selectPhone.index(where: {$0.caseInsensitiveCompare(contactsList[indexPath.row].phone!) == .orderedSame}) != nil {
        print("Same value")
    } else {
        print("Not the same")
    }
    

    【讨论】:

      【解决方案15】:

      只需几行代码,您就可以编写字符串扩展进行比较

      extension String {
      
          func compare(_ with : String)->Bool{
              return self.caseInsensitiveCompare(with) == .orderedSame
          } 
      }
      

      【讨论】:

        【解决方案16】:

        对于 Swift 5 忽略大小写比较两个字符串

        var a = "cash"
        var b = "Cash"
        if(a.caseInsensitiveCompare(b) == .orderedSame){
             print("Ok")
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-29
          • 2011-09-16
          • 1970-01-01
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          • 2011-02-20
          相关资源
          最近更新 更多