2015-05-29 4 views
54

Как мы можем сравнить две строки в случайном игнорировании? для например:Как сравнить две строки, игнорируя случай на языке Swift?

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

Есть ли метод, который возвращает истину, если мы сравним Var & Var Аргументы B

+1

Вы можете конвертировать и в нижний регистр, прежде чем делать сравнение , –

+4

Просто отметим, что 'lowercaseString', упомянутый в некоторых ответах, не будет работать на некоторых языках (например, Straße! = STRASSE) – Alladinian

+0

@ Alladinian, как бы вы предложили сделать это тогда. Большинство примеров для решения этой проблемы показывают преобразование либо во все верхние регистры, либо во все нижние регистры? – Steve

ответ

108

Попробуйте это:

Для старшего скор:

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

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

Swift 3,0

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

В Swift 3 вам нужно использовать 'a.caseInsensitiveCompare (b) == ComparisonResult.orderedSame' – azhidkov

+0

Примечание:' caseInsensitiveCompare (_ :) 'не входит в стандартную библиотеку Swift, а является частью структуры' Foundation' , поэтому требуется «import Foundation». – chrisamanse

+2

Я не могу быть единственным, кто любит распечатку voila. – the4kman

9

Попробуйте это:

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") 
} 
+0

Если я правильно помню, параметры диапазона и локали являются необязательными и могут быть полностью исключены. –

+3

Да, я действительно хотел показать весь метод со всеми параметрами. – Greg

+0

У вас должен быть правильный ответ здесь. Сравнение строк - это не только знание того, являются ли они равными или нет. – Mikael

5

Может просто свернуть свой собственный:

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

Преобразование случая, а затем сравнение неверно. См. Комментарии по этому вопросу. –

19
if a.lowercaseString == b.lowercaseString { 
    //Strings match 
} 
+1

Pure Swift - это путь сюда. Нет необходимости в фундаменте. – Alexander

+1

Преобразование случая, а затем сравнение неверно. См. Комментарии по этому вопросу. –

+0

@JimBalter Я бы не сказал, что это «неправильно», так как он отвечает на пример, заданный в вопросе OP. Для тех из нас, кто не нуждается в поддержке локализации, это намного чище! – toddg

0

Вы также могли бы сделать все буквы в верхний регистр (или строчные) и посмотреть, если они одинаковы.

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") 
} 
+0

Преобразование случая, а затем сравнение неверно. См. Комментарии по этому вопросу. –

20

Используйте caseInsensitiveCompare метод:

let a = "Cash" 
let b = "cash" 
let c = a.caseInsensitiveCompare(b) == .orderedSame 
println(c) // prints "true" 
-1

Swift 3

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

} 
+0

Это неправильно. См. Комментарии по этому вопросу. –

-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' 
+0

Я не сделал это без изменений, но заметьте, что это, как правило, довольно плохая идея, так как вышеописанный оператор сопоставления шаблонов будет иметь приоритет над совпадающим шаблоном, обычно используемым при сопоставлении экземпляров 'String' друг с другом (или с другими' String 'литералы). Представьте, что 'let str =" isCAMELcase "'переводится, в следующем случае:' case IsCamelCase ": ...'. С помощью вышеописанного метода этот «случай» будет введен успешно, что не ожидается, исходя из стандартной реализации libs шаблона «String». Обновленный ответ Swift 3 по-прежнему хорош, но ... – dfri

+0

... рассмотрите возможность использования настраиваемой функции (или 'String' extension) в качестве помощника выше, а не переопределения соответствия шаблону' String' по умолчанию. – dfri

-1

Swift 3:

Вы также можете использовать локализованы регистрозависимости сравнение между функцией двух строк и возвращает Bool

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

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

Swift 3

ПРАВИЛЬНЫЙ ПУТЬ:

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 
    } 

б.

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

гр.

if a.capitalized() == b.capitalized() { 
     //Strings match 
    } 
0
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")) 
0

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 
0

localizedCaseInsensitiveContains: Возвращает приемник содержит ли данную строку, выполняя регистронезависимый, локализованный в курсе поиска

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