Làm thế nào để so sánh hai chuỗi bỏ qua chữ hoa và chữ thường trong ngôn ngữ Swift?


95

Làm thế nào chúng ta có thể so sánh hai chuỗi trong trường hợp bỏ qua nhanh chóng? ví dụ:

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

Có phương thức nào sẽ trả về true nếu chúng ta so sánh var a & var b không


1
Bạn có thể chuyển đổi cả hai thành chữ thường trước khi thực hiện so sánh.
Dino Tw

8
Chỉ cần lưu ý rằng điều lowercaseStringđó được đề cập trong một số câu trả lời sẽ không thành công trong một số ngôn ngữ (ví dụ: Straße! = STRASSE)
Alladinian

@Alladinian làm thế nào bạn sẽ đề nghị làm điều đó sau đó. Hầu hết các ví dụ để giải quyết vấn đề này hiển thị chuyển đổi thành tất cả chữ hoa hoặc chữ thường?
Steve

5
@Steve Apple gợi ý caseInsensitiveCompare:& localizedCaseInsensitiveCompare:thay vào đó
Alladinian

3
@Steve Chắc chắn! (bạn có thể thử "Straße".localizedCaseInsensitiveCompare("STRASSE")- Nhớ nhập Foundation)
Alladinian

Câu trả lời:


13

Thử cái này:

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)

kết quả là kiểu enum NSComparisonResult:

enum NSComparisonResult : Int {

    case OrderedAscending
    case OrderedSame
    case OrderedDescending
}

Vì vậy, bạn có thể sử dụng câu lệnh if:

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

Nếu tôi nhớ lại chính xác, các thông số phạm vi và ngôn ngữ là tùy chọn và có thể bị bỏ qua hoàn toàn.
Mick MacCallum

3
Đúng vậy, tôi muốn hiển thị toàn bộ phương thức với tất cả các tham số.
Greg

Bạn sẽ có câu trả lời đúng ở đây. So sánh chuỗi không chỉ về biết nếu chúng bằng nhau hay không
Mikael

181

Thử cái này :

Đối với yến cũ:

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

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

Swift 3+

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

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

13
Trong Swift 3 bạn cần sử dụnga.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov

2
Lưu ý: caseInsensitiveCompare(_:)không có trong Thư viện chuẩn Swift, thay vào đó nó là một phần của Foundationkhung, do đó, đòi hỏi import Foundation.
chrisamanse

Có bất kỳ lý do tại sao điều này là tốt hơn bất kỳ a.lowercased() == b.lowercased()?
jowie

36

Sử dụng caseInsensitiveComparephương pháp:

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

ComparisonResult cho bạn biết từ nào đến sớm hơn từ khác theo thứ tự từ vựng (tức là từ nào đến gần phía trước của từ điển). .orderedSamecó nghĩa là các chuỗi sẽ kết thúc ở cùng một vị trí trong từ điển


những gì hiện .orderedSamecó nghĩa là? Các tài liệu chỉ nói Hai toán hạng bằng nhau . Nhưng tại sao từ 'đặt hàng' lại được sử dụng ở đây? Có một trình tự hoặc một cái gì đó? Và cái gì Toán hạng bên trái nhỏ hơn toán hạng bên phải. ( .orderedAscending) Có nghĩa là cho các chuỗi
Mật ong

1
Kết quả so sánh @Honey cho bạn biết từ nào đến sớm hơn từ nào theo thứ tự từ vựng (nghĩa là từ nào đến gần đầu từ điển hơn). .orderedSamenghĩa là các chuỗi sẽ kết thúc ở cùng một vị trí trong từ điển.
dasblinkenlight

1
@Honey .orderedSamelà viết tắt của ComparisonResult.orderSame... bạn không cần phải đặt tên cho kiểu vì trình biên dịch biết rằng caseInsensitiveComparetrả về a ComparisonResult. "Hai toán hạng bằng nhau" - chúng bằng nhau theo một thứ tự cụ thể ... rõ ràng, "Tiền mặt" và "tiền mặt" không phải là các giá trị chuỗi giống hệt nhau. "Nhưng tại sao từ 'đặt hàng' lại được sử dụng ở đây?" - bởi vì nó là kết quả của một so sánh có thứ tự. Các giá trị khác là orderedAscendingorderedDescending... nó không chỉ là một câu hỏi giống nhau hay khác nhau. Đối với "nhỏ hơn": chuỗi giống như số trong một cơ số lớn.
Jim Balter

1
Tôi cảm thấy như đây là thiết kế API khủng khiếp. Chữ ký không phải là dễ dàng để đọc ... Làm cho nó a.caseInsensitiveCompare(b, comparing: .orderedSame)có thể đã được dễ đọc hơn ...
Mật ong

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

2
Pure Swift là cách để đi đến đây. Không cần kem nền.
Alexander - Phục hồi Monica

2
Trường hợp chuyển đổi rồi so sánh là sai. Xem bình luận dưới câu hỏi.
Jim Balter

1
@JimBalter Tôi sẽ không nói nó "sai" vì nó trả lời ví dụ được đưa ra trong câu hỏi của OP. Đối với những người trong chúng ta, những người không cần hỗ trợ bản địa hóa, điều này rõ ràng hơn nhiều!
toddg

4
^ Không, nó sai. Điều gì đó xảy ra để làm việc cho một ví dụ là không liên quan. Bản hack này không "sạch" hơn chút nào. Câu trả lời được chấp nhận là giải pháp chính xác, sạch sẽ.
Jim Balter

8

CÁCH ĐÚNG:

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

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

Xin lưu ý: ComparisonResult.orderedSame cũng có thể được viết tắt là .orderedSame.

NHỮNG CÁCH KHÁC:

a.

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

b.

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

c.

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

7

Có thể chỉ cuộn của riêng bạn:

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

3
Trường hợp chuyển đổi rồi so sánh là sai. Xem bình luận dưới câu hỏi.
Jim Balter

6

localizedCaseInsensitiveContains : Trả về liệu bộ thu có chứa một chuỗi đã cho hay không bằng cách thực hiện tìm kiếm không phân biệt chữ hoa chữ thường, nhận biết ngôn ngữ

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

Đã chỉnh sửa :

caseInsensitiveCompare : Trả về kết quả của việc gọi so sánh (_: tùy chọn :) với NSCaseInsensitiveSearch là tùy chọn duy nhất.

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

1
Câu hỏi là về sự so sánh, không phải là ngăn chặn.
Jim Balter

Nếu "a chứa b""b chứa a" , chúng bằng nhau. Vì vậy, đây chắc chắn là một giải pháp khả thi, ngay cả khi nó có thể không phải là giải pháp hiệu quả nhất.
Philipp Maurer

1

Bạn cũng có thể viết hoa tất cả các chữ cái (hoặc chữ thường) và xem chúng có giống nhau không.

var a =Cashvar b =CAShif a.uppercaseString == b.uppercaseString{
  //DO SOMETHING
}

Điều này sẽ làm cho cả hai biến là ”CASH”và do đó chúng bằng nhau.

Bạn cũng có thể tạo một Stringphần mở rộng

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

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

3
Trường hợp chuyển đổi rồi so sánh là sai. Xem bình luận dưới câu hỏi.
Jim Balter

1

Ví dụ so sánh số điện thoại; sử dụng nhanh chóng 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, tôi đã đi theo lộ trình mở rộng chuỗi bằng cách sử dụng caseInsensitiveCompare () làm mẫu (nhưng cho phép toán hạng là một tùy chọn). Đây là sân chơi mà tôi đã sử dụng để tập hợp nó lại với nhau (mới sử dụng Swift nên rất hoan nghênh phản hồi).

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
Bạn chỉ có thể sử dụng .orderedSamehơn là ComparisonResult.orderedSame.
Jim Balter

0

Bạn chỉ có thể viết Phần mở rộng chuỗi của mình để so sánh chỉ trong một vài dòng mã

extension String {

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

0

Đối với Swift 5 Bỏ qua trường hợp và so sánh hai chuỗi

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

-1

Swift 3

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

}

2
Cái này sai. Xem bình luận dưới câu hỏi.
Jim Balter

-1

Swift 3 : Bạn có thể xác định toán tử của riêng mình, ví dụ ~=.

infix operator ~=

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

Sau đó, bạn có thể thử trong một sân chơi

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

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

test() // prints 'same'

Tôi không phản đối điều này, nhưng lưu ý rằng đây nói chung là một ý tưởng khá tồi, vì toán tử so khớp mẫu tùy chỉnh ở trên sẽ được ưu tiên hơn so với đối sánh mẫu gốc thường được sử dụng khi đối sánh các bản sao với Stringnhau (hoặc với các Stringchữ khác ). Hãy tưởng tượng let str = "isCAMELcase"được chuyển sang, với một trường hợp như sau: case "IsCamelCase": ... . Với phương pháp trên, điều này casesẽ được nhập thành công, điều này không được mong đợi đến từ việc triển khai chuẩn libs của Stringđối sánh mẫu. Mặc dù vậy, câu trả lời Swift 3 được cập nhật vẫn tốt, nhưng ...
dfri

... hãy xem xét sử dụng một hàm tùy chỉnh (hoặc Stringtiện ích mở rộng) làm trợ giúp ở trên thay vì ghi đè Stringđối sánh mẫu mặc định .
dfri 19/02/17

-1
extension String
{
    func equalIgnoreCase(_ compare:String) -> Bool
    {
        return self.uppercased() == compare.uppercased()
    }
}

mẫu sử dụng

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

1
Điều này không hoạt động đối với một số chuỗi trong một số ngôn ngữ ... hãy xem các nhận xét bên dưới câu hỏi và nhiều câu trả lời đúng, một số câu trả lời - bao gồm cả câu được chấp nhận - trước bạn nhiều năm.
Jim Balter

-2

Swift 3:

Bạn cũng có thể sử dụng so sánh không phân biệt chữ hoa chữ thường được bản địa hóa giữa hàm hai chuỗi và nó trả về Bool

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

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

2
Giải pháp của bạn không chính xác. Hãy xem xét các chuỗi "casha" và "Tiền mặt"
clarkcox3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.