如何在Swift语言中比较两个忽略大小写的字符串?


95

如何快速忽略大小写比较两个字符串?例如:

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

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


1
您可以在进行比较之前将两者都转换为小写。
Dino Tw 2015年

8
只是要注意,lowercaseString某些答案中提到的某些语言会失败(例如,Straße!= STRASSE)
Alladinian

@Alladinian,您会怎么建议呢?解决此问题的大多数示例都显示转换为全部大写还是全部小写?
史蒂夫(Steve)

5
@Steve苹果建议caseInsensitiveCompare:localizedCaseInsensitiveCompare:替代
Alladinian

3
@Steve当然!(您可以尝试"Straße".localizedCaseInsensitiveCompare("STRASSE")-记住要导入Foundation
阿拉丁(Aladinian

Answers:


13

试试这个:

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)

结果是NSComparisonResult枚举的类型:

enum NSComparisonResult : Int {

    case OrderedAscending
    case OrderedSame
    case OrderedDescending
}

因此,您可以使用if语句:

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

如果我没记错的话,range和locale参数是可选的,可以完全省略。
Mick MacCallum

3
是的,确实,我想展示所有参数的完整方法。
格雷格

您应该在这里有正确的答案。比较字符串不仅是要知道它们是否相等
Mikael

181

试试这个 :

对于较早的Swift:

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

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

迅捷3+

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

if(a.caseInsensitiveCompare(b) == .orderedSame){
    print("voila")
}

13
在Swift 3中,您需要使用a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov '16

2
注意:caseInsensitiveCompare(_:)不包含在Swift标准库中,而是Foundation框架的一部分,因此需要import Foundation
chrisamanse

有什么理由比这更好a.lowercased() == b.lowercased()吗?
jowie

36

使用caseInsensitiveCompare方法:

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

compareResult会告诉您哪个单词在字典顺序上比另一个单词早(即哪个单词更靠近字典的开头)。.orderedSame表示字符串将在字典中的相同位置结束


什么.orderedSame意思 该文档只说两个操作数是相等的。但是为什么在这里使用“订单”一词呢?有序列或什么东西吗?又是什么左操作数大于右操作数较小。.orderedAscending)表示字符串
亲爱的,

1
@Honey比较结果会告诉您哪个单词在字典顺序上比另一个单词早(即哪个单词更接近词典的开头)。.orderedSame表示字符串将在字典中的同一位置结束。
dasblinkenlight

1
@Honey .orderedSame的缩写ComparisonResult.orderSame。。。您不必命名类型,因为编译器知道会caseInsensitiveCompare返回a ComparisonResult。“两个操作数相等”-根据特定顺序它们相等...显然,“现金”和“现金”不是相同的字符串值。“但是为什么在这里使用'order'这个词呢?” -因为这是有序比较的结果。其他值是orderedAscendingand orderedDescending...这不只是一个相同或不同的问题。至于“较小”:字符串就像一个大底数中的数字。
吉姆·巴尔特

1
我觉得这是糟糕的API设计。签名不容易阅读...使其a.caseInsensitiveCompare(b, comparing: .orderedSame)更具可读性...
Honey

25
if a.lowercaseString == b.lowercaseString {
    //Strings match
}

2
纯Swift是去这里的方式。无需基础。
亚历山大-恢复莫妮卡

2
转换大小写然后比较是错误的。请参阅问题下的评论。
Jim Balter

1
@JimBalter我不会说这是“错误的”,因为它回答了OP问题中给出的示例。对于那些不需要支持本地化的人来说,这要干净得多!
toddg

4
^不,这是错误的。一个例子发生的事情是无关紧要的。这种黑客根本不是“清洁工”。接受的答案将给出正确,干净的解决方案。
吉姆·巴尔特

8

正确的方法:

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 
}

7

可以自己滚动:

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

3
转换大小写然后比较是错误的。请参阅问题下的评论。
Jim Balter

6

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)
}

1
问题是关于比较,而不是遏制。
吉姆·巴尔特

如果“ a包含b”“ b包含a”,则它们相等。因此,即使这可能不是最有效的解决方案,也肯定是可能的解决方案。
菲利普·毛

1

您还可以将所有字母都大写(或小写),看看它们是否相同。

var a =Cashvar b =CAShif 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")
}

3
转换大小写然后比较是错误的。请参阅问题下的评论。
Jim Balter

1

电话号码比较示例;使用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")
}

0

Swift 4,我使用caseInsensitiveCompare()作为模板走了String扩展路线(但允许操作数是可选的)。这是我以前把它放在一起的操场(对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

2
您可以使用.orderedSame而不是ComparisonResult.orderedSame
吉姆·巴尔特

0

您只需编写几行代码即可编写String Extension进行比较

extension String {

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

0

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

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


-1

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答案虽然仍然不错,但是...
dfri

...考虑使用自定义函数(或String扩展名)作为上述的帮助程序,而不是覆盖默认的String模式匹配。
dfri

-1
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"))

1
这不适用于某些语言的某些字符串...请参阅问题下的注释,以及许多正确答案,其中一些-包括被接受的答案-早于您的答案。
吉姆·巴尔特

-2

斯威夫特3:

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

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

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

2
您的解决方案不正确。考虑字符串“ casha”和“ Cash”
clarkcox3 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.