Bagaimana cara membandingkan dua string mengabaikan kasus dalam bahasa Swift?

97

Bagaimana kita bisa membandingkan dua string dalam kasus pengabaian cepat? misalnya:

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

Apakah ada metode yang akan mengembalikan true jika kita membandingkan var a & var b

ak_tyagi
sumber
1
Anda dapat mengubah keduanya menjadi huruf kecil sebelum melakukan perbandingan.
Dino Tw
9
Hanya untuk dicatat bahwa lowercaseStringyang disebutkan dalam beberapa jawaban akan gagal dalam beberapa bahasa (Straße! =
STRASSE
@ Alladinian bagaimana saran Anda untuk melakukannya. Sebagian besar contoh untuk mengatasi masalah ini menunjukkan konversi ke semua huruf besar atau semua huruf kecil?
Steve
5
@ Steve Apple menyarankan caseInsensitiveCompare:& localizedCaseInsensitiveCompare:sebagai gantinya
Alladinian
3
@ Steve Yakin! (Anda dapat mencoba "Straße".localizedCaseInsensitiveCompare("STRASSE")- Ingatlah untuk mengimpor Foundation)
Alladinian

Jawaban:

14

Coba ini:

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)

hasilnya adalah jenis enum NSComparisonResult:

enum NSComparisonResult : Int {

    case OrderedAscending
    case OrderedSame
    case OrderedDescending
}

Jadi Anda bisa menggunakan pernyataan if:

if result == .OrderedSame {
    println("equal")
} else {
    println("not equal")
}
Greg
sumber
Jika saya mengingatnya dengan benar, parameter jarak dan lokal bersifat opsional dan dapat dihilangkan seluruhnya.
Mick MacCallum
3
Ya memang, saya ingin menunjukkan seluruh metode dengan semua parameter.
Greg
Anda seharusnya memiliki jawaban yang benar di sini. Membandingkan string tidak hanya tentang mengetahui apakah mereka sama atau tidak
Mikael
184

Coba ini :

Untuk swift yang lebih tua:

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

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

Cepat 3+

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

if(a.caseInsensitiveCompare(b) == .orderedSame){
    print("voila")
}
iAnurag
sumber
13
Di Swift 3 Anda perlu menggunakana.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov
3
Catatan: caseInsensitiveCompare(_:)tidak termasuk dalam Swift Standard Library, melainkan bagian dari Foundationkerangka kerja, sehingga memerlukan import Foundation.
chrisamanse
Apakah ada alasan mengapa ini lebih baik dari a.lowercased() == b.lowercased()?
jowie
@jowie seperti yang disebutkan di komentar lain, menggunakan huruf besar / kecil () mungkin gagal pada bahasa tertentu.
cumanzor
36

Gunakan caseInsensitiveComparemetode:

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

ComparisonResult memberi tahu Anda kata mana yang muncul lebih awal dari yang lain dalam urutan leksikografik (yaitu kata mana yang lebih dekat ke depan kamus). .orderedSameartinya string akan berakhir di tempat yang sama di kamus

Sergey Kalinichenko
sumber
apa .orderedSamemaksudnya The docs hanya mengatakan dua operan adalah sama . Tetapi mengapa kata 'ketertiban' digunakan di sini? Apakah ada urutan atau sesuatu? Dan apa operan kiri lebih kecil dari operan kanan. ( .orderedAscending) berarti untuk string
Honey
1
Hasil Perbandingan @Honey memberi tahu Anda kata mana yang muncul lebih awal dari yang lain dalam urutan leksikografik (yaitu kata mana yang lebih dekat ke depan kamus). .orderedSameartinya string akan berakhir di tempat yang sama di kamus.
Sergey Kalinichenko
1
@Honey .orderedSameadalah kependekan dari ComparisonResult.orderSame... Anda tidak perlu menamai tipe karena kompiler tahu bahwa caseInsensitiveComparemengembalikan file ComparisonResult. "Kedua operan itu sama" - keduanya sama menurut urutan tertentu ... jelas, "Tunai" dan "uang tunai" bukanlah nilai string yang identik. "Tapi kenapa kata 'order' digunakan di sini?" - karena ini adalah hasil dari perbandingan yang teratur. Nilai-nilai lainnya adalah orderedAscendingdan orderedDescending... ini bukan hanya soal yang sama atau berbeda. Adapun "lebih kecil": string seperti angka dalam basis besar.
Jim Balter
1
Saya merasa ini adalah desain API yang buruk. Tanda tangannya tidak mudah dibaca ... Membuatnya a.caseInsensitiveCompare(b, comparing: .orderedSame)akan lebih mudah dibaca ...
Sayang
25
if a.lowercaseString == b.lowercaseString {
    //Strings match
}
Steve
sumber
2
Pure Swift adalah cara untuk pergi ke sini. Tidak perlu alas bedak.
Alexander - Kembalikan Monica
2
Mengonversi kasus dan kemudian membandingkan adalah salah. Lihat komentar di bawah pertanyaan.
Jim Balter
1
@JimBalter Saya tidak akan mengatakan itu "salah" karena menjawab contoh yang diberikan dalam pertanyaan OP. Bagi kita yang tidak perlu mendukung pelokalan, ini jauh lebih bersih!
toddg
4
^ Tidak, itu salah. Bahwa sesuatu terjadi untuk satu contoh adalah tidak relevan. Hack ini sama sekali tidak "bersih". Jawaban yang diterima memberikan solusi yang benar dan bersih.
Jim Balter
8

JALAN YANG BENAR:

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

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

Harap diperhatikan: ComparisonResult.orderedSame juga dapat ditulis sebagai .orderedSame dalam singkatan.

CARA LAIN:

Sebuah.

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

b.

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

c.

if a.capitalized() == b.capitalized() {
    //Strings match 
}
Saurabh Bhatia
sumber
7

Bisa gulung sendiri:

func equalIgnoringCase(a:String, b:String) -> Bool {
    return a.lowercaseString == b.lowercaseString
}
Matt
sumber
3
Mengonversi kasus dan kemudian membandingkan adalah salah. Lihat komentar di bawah pertanyaan.
Jim Balter
7

localizedCaseInsensitiveContains : Mengembalikan apakah penerima berisi string tertentu dengan melakukan pencarian case-insensitive, locale-aware

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

Diedit :

caseInsensitiveCompare : Menampilkan hasil pemanggilan bandingkan (_: options :) dengan NSCaseInsensitiveSearch sebagai satu-satunya opsi.

if a.caseInsensitiveCompare(b) == .orderedSame {
    //returns true if a equals b (case insensitive)
}
cgeek
sumber
1
Pertanyaannya adalah tentang perbandingan, bukan penahanan.
Jim Balter
Jika "a berisi b" dan "b berisi a" , keduanya sama. Jadi ini pasti solusi yang mungkin, bahkan jika itu mungkin bukan yang paling efektif.
Philipp Maurer
1

Anda juga bisa membuat semua huruf menjadi huruf besar (atau huruf kecil) dan melihat apakah semuanya sama.

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

Ini akan membuat kedua variabel menjadi sama ”CASH”dan karenanya sama.

Anda juga bisa membuat Stringekstensi

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

if "Something ELSE".equalsIgnoreCase("something Else"){
  print("TRUE")
}
milo526
sumber
3
Mengonversi kasus dan kemudian membandingkan adalah salah. Lihat komentar di bawah pertanyaan.
Jim Balter
1

Contoh perbandingan nomor telepon; menggunakan 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")
}
ikbal
sumber
0

Swift 4, saya menggunakan rute ekstensi String menggunakan caseInsensitiveCompare () sebagai template (tetapi mengizinkan operan menjadi opsional). Inilah taman bermain yang saya gunakan untuk menggabungkannya (baru mengenal Swift jadi umpan balik lebih dari diterima).

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
William T. Mallard
sumber
2
Anda bisa menggunakan .orderedSamedaripada ComparisonResult.orderedSame.
Jim Balter
0

Anda bisa menulis Ekstensi String untuk perbandingan hanya dalam beberapa baris kode

extension String {

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

Untuk Swift 5 Mengabaikan case dan membandingkan dua string

var a = "cash"
var b = "Cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
     print("Ok")
}
M Murteza
sumber
-1

Cepat 3

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

}
DoubleK
sumber
2
Ini salah. Lihat komentar di bawah pertanyaan.
Jim Balter
-1

Swift 3 : Anda dapat menentukan operator Anda sendiri, mis ~=.

infix operator ~=

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

Yang kemudian bisa Anda coba di taman bermain

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

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

test() // prints 'same'
Sajjon
sumber
Saya tidak meremehkan ini, tetapi perhatikan bahwa ini umumnya ide yang sangat buruk, karena operator pencocokan pola khusus di atas akan lebih diutamakan daripada pencocokan pola asli yang biasanya digunakan saat mencocokkan Stringcontoh satu sama lain (atau ke Stringliteral lain ). Bayangkan let str = "isCAMELcase"sedang beralih, dengan kasus sebagai berikut: case "IsCamelCase": ... . Dengan metode di atas, ini caseakan berhasil dimasukkan, yang tidak diharapkan berasal dari implementasi libs standar Stringpencocokan pola. Jawaban Swift 3 yang diperbarui masih bagus, tapi ...
dfrib
... pertimbangkan untuk menggunakan fungsi khusus (atau Stringekstensi) sebagai pembantu di atas daripada mengganti Stringpencocokan pola default .
Dfrib
-1
extension String
{
    func equalIgnoreCase(_ compare:String) -> Bool
    {
        return self.uppercased() == compare.uppercased()
    }
}

contoh penggunaan

print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))
luhuiya
sumber
1
Ini tidak berfungsi untuk beberapa string dalam beberapa bahasa ... lihat komentar di bawah pertanyaan, dan banyak jawaban benar, beberapa di antaranya - termasuk yang diterima - mendahului Anda beberapa tahun.
Jim Balter
-2

Cepat 3:

Anda juga dapat menggunakan perbandingan tidak peka huruf besar / kecil yang dilokalkan antara dua fungsi string dan mengembalikannya Bool

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

if a.localizedCaseInsensitiveContains(b) {
    print("Identical")           
} else {
    print("Non Identical")
}
Kegham K.
sumber
2
Solusi Anda salah. Pertimbangkan string "casha" dan "Cash"
clarkcox3