Swift 언어에서 대소 문자를 무시하고 두 문자열을 비교하는 방법은 무엇입니까?


95

신속한 무시 케이스에서 두 문자열을 어떻게 비교할 수 있습니까? 예 :

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

var a와 var b를 비교하면 true를 반환하는 메서드가 있습니까?


1
비교하기 전에 둘 다 소문자로 변환 할 수 있습니다.
Dino Tw

8
그냥 참고로 lowercaseString그가 (! 예를 들어 = STRASSE 트) 일부 언어에서 실패하는 몇 가지 답변에서 언급 한
Alladinian

@Alladinian 당신이 그것을 어떻게 제안하겠습니까? 이 문제를 해결하는 대부분의 예는 모두 대문자 또는 모두 소문자로 변환하는 것을 보여줍니다.
Steve

5
caseInsensitiveCompare:localizedCaseInsensitiveCompare:
@Steve

3
@Steve 물론입니다! (당신은 시도 할 수 있습니다 "Straße".localizedCaseInsensitiveCompare("STRASSE")-가져 오는 것을 기억하십시오 Foundation)
Alladinian

답변:


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

올바르게 기억하면 범위 및 로케일 매개 변수는 선택 사항이며 완전히 생략 할 수 있습니다.
Mick MacCallum 2015 년

3
예, 모든 매개 변수를 사용하여 전체 방법을 보여주고 싶었습니다.
Greg

여기에 정답이 있어야합니다. 문자열을 비교하는 것은 동일한 지 아닌지를 아는 것뿐만 아니라
Mikael

181

이 시도 :

이전 Swift의 경우 :

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
스위프트 3에서는 사용할 필요가a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov

2
참고 : caseInsensitiveCompare(_:)는 Swift Standard Library에 포함되어 있지 않고 Foundation프레임 워크의 일부 이므로 import Foundation.
chrisamanse 2016

이것이 더 나은 이유가 a.lowercased() == b.lowercased()있습니까?
jowie

36

사용 caseInsensitiveCompare방법 :

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

ComparisonResult 는 사전 식 순서로 다른 단어보다 먼저 오는 단어를 알려줍니다 (즉, 사전의 앞쪽에 더 가까운 단어). .orderedSame문자열이 사전의 동일한 위치에 있음을 의미합니다.


무슨 .orderedSame뜻이야? 문서는 단지 말을 두 피연산자가 동일한 . 그런데 여기서 '순서'라는 단어가 사용 된 이유는 무엇입니까? 시퀀스가 있나요? 그리고 왼쪽 피연산자는 오른쪽 피연산자보다 작습니다. ( .orderedAscending) 문자열의 의미
Honey

1
@Honey 비교 결과는 사전 식 순서로 다른 단어보다 먼저 오는 단어를 알려줍니다 (즉, 어떤 단어가 사전의 앞쪽에 더 가까이 오는지). .orderedSame문자열이 사전의 같은 위치에 끝날 것임을 의미합니다.
dasblinkenlight

1
@Honey는 .orderedSame대한 짧은 ComparisonResult.orderSame컴파일러가 알고 있기 때문에 당신이 유형의 이름을 필요가 없습니다 ... caseInsensitiveCompare리턴을 ComparisonResult. "두 피연산자는 같음"-특정 순서에 따라 동일합니다. "현금"과 "현금"은 동일한 문자열 값이 아닙니다. "하지만 여기서 '주문'이라는 단어가 사용 된 이유는 무엇입니까?" -정렬 된 비교의 결과이기 때문입니다. 다른 값은 다음 orderedAscendingorderedDescending그냥 동일하거나 서로 다른의 문제가 아니다 .... "작은"에 관해서 : 문자열은 큰 밑의 숫자와 같습니다.
Jim Balter 2018

1
이것이 끔찍한 API 디자인 인 것 같습니다. 서명은 만들기 ... 읽기 쉬운 일이 아니다 a.caseInsensitiveCompare(b, comparing: .orderedSame)... 더 읽기했을

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

2
퓨어 스위프트는 여기로가는 길입니다. 기초가 필요 없습니다.
알렉산더 - 분석 재개 모니카

2
케이스를 변환하고 비교하는 것은 잘못되었습니다. 질문 아래의 설명을 참조하십시오.
Jim Balter 2017

1
@JimBalter OP의 질문에 주어진 예에 답하기 때문에 "잘못"이라고 말하지 않을 것입니다. 현지화를 지원할 필요가없는 우리에게는 훨씬 더 깔끔합니다!
toddg

4
^ 아니요, 틀 렸습니다. 한 가지 예에서 어떤 일이 발생한다는 것은 관련이 없습니다. 이 해킹은 전혀 "깨끗한"것이 아닙니다. 받아 들여진 대답은 정확하고 깨끗한 솔루션을 제공합니다.
Jim Balter

8

올바른 방법 :

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

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

참고 : ComparisonResult.orderedSame은 약어로 .orderSame으로 작성할 수도 있습니다.

다른 방법들:

ㅏ.

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

비.

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

씨.

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

7

직접 굴릴 수 있습니다.

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

3
케이스를 변환하고 비교하는 것은 잘못되었습니다. 질문 아래의 설명을 참조하십시오.
Jim Balter 2017

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
문제는 격리가 아니라 비교에 관한 것입니다.
Jim Balter 2018

경우 "a가 b를 포함""B가 포함 된"은 , 그들은 동일하다. 따라서 이것은 가장 효과적인 해결책이 아닐지라도 확실히 가능한 해결책입니다.
Philipp Maurer

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 2017

1

전화 번호 비교 예; 신속한 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 ()를 템플릿으로 사용하여 문자열 확장 경로를갔습니다 (그러나 피연산자가 선택 사항이 될 수 있음). 여기에 제가 함께 사용했던 플레이 그라운드가 있습니다.

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.
Jim Balter 2018

0

몇 줄의 코드로 비교를 위해 문자열 확장을 작성할 수 있습니다.

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

스위프트 3

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

}

2
이것은 잘못되었습니다. 질문 아래의 설명을 참조하십시오.
Jim Balter 2017

-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패턴 일치 의 표준 libs 구현에서 오는 것이 아닙니다 . 업데이트 된 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
이것은 일부 언어의 일부 문자열에서 작동하지 않습니다 ... 질문 아래의 주석과 많은 정답을 참조하십시오. 그 중 일부는 허용되는 것을 포함하여 몇 년이 선행되었습니다.
Jim Balter 2018

-2

스위프트 3 :

두 문자열 함수간에 지역화 된 대소 문자를 구분하지 않는 비교를 사용할 수도 있습니다. Bool

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

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

2
귀하의 솔루션이 올바르지 않습니다. 문자열 "casha"와 "현금"고려
clarkcox3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.