Check if a string exists in an array case insensitively

SwiftContains

Swift Problem Overview


Declaration:

let listArray = ["kashif"]
let word = "kashif"

then this

contains(listArray, word) 

Returns true but if declaration is:

let word = "Kashif"

then it returns false because comparison is case sensitive.

How to make this comparison case insensitive?

Swift Solutions


Solution 1 - Swift

Xcode 8 • Swift 3 or later

let list = ["kashif"]
let word = "Kashif"

if list.contains(where: {$0.caseInsensitiveCompare(word) == .orderedSame}) {
    print(true)  // true
}

alternatively:

if list.contains(where: {$0.compare(word, options: .caseInsensitive) == .orderedSame}) {
    print(true)  // true
}

if you would like to know the position(s) of the element in the array (it might find more than one element that matches the predicate):

let indices = list.indices.filter { list[$0].caseInsensitiveCompare(word) == .orderedSame }
print(indices)  // [0]

You can also use localizedStandardContains method which is case and diacritic insensitive and would match a substring as well:

func localizedStandardContains<T>(_ string: T) -> Bool where T : StringProtocol

>Discussion This is the most appropriate method for doing user-level string searches, similar to how searches are done generally in the system. The search is locale-aware, case and diacritic insensitive. The exact list of search options applied may change over time.

let list = ["kashif"]
let word = "Káshif"

if list.contains(where: {$0.localizedStandardContains(word) }) {
    print(true)  // true
}

Solution 2 - Swift

you can use

word.lowercaseString 

to convert the string to all lowercase characters

Solution 3 - Swift

For checking if a string exists in a array (case insensitively), please use

listArray.localizedCaseInsensitiveContainsString(word) 

where listArray is the name of array and word is your searched text

This code works in Swift 2.2

Solution 4 - Swift

Swift 4

Just make everything (queries and results) case insensitive.

for item in listArray {
    if item.lowercased().contains(word.lowercased()) {
        searchResults.append(item)
    }
}

Solution 5 - Swift

Try this:

let loword = word.lowercaseString
let found = contains(listArray) { $0.lowercaseString == loword }

Solution 6 - Swift

You can add an extension:

Swift 5

extension Array where Element == String {
    func containsIgnoringCase(_ element: Element) -> Bool {
        contains { $0.caseInsensitiveCompare(element) == .orderedSame }
    }
}

and use it like this:

["tEst"].containsIgnoringCase("TeSt") // true

Solution 7 - Swift

For checking if a string exists in a array with more Options(caseInsensitive, anchored/search is limited to start)

using Foundation range(of:options:)
let list = ["kashif"]
let word = "Kashif"


if list.contains(where: {$0.range(of: word, options: [.caseInsensitive, .anchored]) != nil}) {
    print(true)  // true
}

if let index = list.index(where: {$0.range(of: word, options: [.caseInsensitive, .anchored]) != nil}) {
    print("Found at index \(index)")  // true
}

Solution 8 - Swift

swift 5, swift 4.2 , use the code in the below.

let list = ["kAshif"]
let word = "Kashif"

if list.contains(where: { $0.caseInsensitiveCompare(word) == .orderedSame }) {
    print("contains is true")
}

Solution 9 - Swift

SWIFT 3.0:

Finding a case insensitive string in a string array is cool and all, but if you don't have an index it can not be cool for certain situations.

Here is my solution:

let stringArray = ["FOO", "bar"]()
if let index = stringArray.index(where: {$0.caseInsensitiveCompare("foo") == .orderedSame}) {
   print("STRING \(stringArray[index]) FOUND AT INDEX \(index)")
   //prints "STRING FOO FOUND AT INDEX 0"                                             
}

This is better than the other answers b/c you have index of the object in the array, so you can grab the object and do whatever you please :)

Solution 10 - Swift

Expanding on @Govind Kumawat's answer

The simple comparison for a searchString in a word is:

word.range(of: searchString, options: .caseInsensitive) != nil

As functions:

func containsCaseInsensitive(searchString: String, in string: String) -> Bool {
    return string.range(of: searchString, options: .caseInsensitive) != nil
}

func containsCaseInsensitive(searchString: String, in array: [String]) -> Bool {
    return array.contains {$0.range(of: searchString, options: .caseInsensitive) != nil}
}

func caseInsensitiveMatches(searchString: String, in array: [String]) -> [String] {
    return array.compactMap { string in
        return string.range(of: searchString, options: .caseInsensitive) != nil
            ? string
            : nil
    }
}

Solution 11 - Swift

My example

func updateSearchResultsForSearchController(searchController: UISearchController) {
    guard let searchText = searchController.searchBar.text else { return }
    let countries = Countries.getAllCountries()
    filteredCountries = countries.filter() {
        return $0.name.containsString(searchText) || $0.name.lowercaseString.containsString(searchText)
    }
    self.tableView.reloadData()
}

Solution 12 - Swift

If anyone is looking to search values from within model class, say

struct Country {
   var name: String
}

One case do case insensitive checks like below -

let filteredList = countries.filter({ $0.name.range(of: "searchText", options: .caseInsensitive) != nil })

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKashifView Question on Stackoverflow
Solution 1 - SwiftLeo DabusView Answer on Stackoverflow
Solution 2 - SwiftCharlie HallView Answer on Stackoverflow
Solution 3 - SwiftiosView Answer on Stackoverflow
Solution 4 - Swiftkidcoder SAVE UKRAINEView Answer on Stackoverflow
Solution 5 - SwiftMario ZannoneView Answer on Stackoverflow
Solution 6 - SwiftAlaeddineView Answer on Stackoverflow
Solution 7 - SwiftGovind KumawatView Answer on Stackoverflow
Solution 8 - SwiftZgpeaceView Answer on Stackoverflow
Solution 9 - SwiftJosh O'ConnorView Answer on Stackoverflow
Solution 10 - SwiftRyan HView Answer on Stackoverflow
Solution 11 - SwiftAlexander KhitevView Answer on Stackoverflow
Solution 12 - SwiftPankaj GaikarView Answer on Stackoverflow