대소 문자를 구분하지 않는 비교 NSString


답변:


564
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
  // strings are equal except for possibly case
}

설명서는 검색 및 비교 방법에 있습니다.


152
그것은 경우에 것을 언급 할만큼 가치있다 @"Some String"다른 전화에서 수신 될 일이있다 nil, 당신이 if줄 것이다 true전송로 caseInsensitiveComparenil유효하며 다른 결과 nil우리의 경우와 비교하는 NSOrderedSame반환합니다 true( NSOrderedSame0으로 정의된다). 이것은 내 경우와 마찬가지로 매우 파괴적인 버그의 원천이 될 수 있습니다. 건배!
matm

10
이에 대한 나의 해결 방법 NSString은 부울을 반환하는 범주 내부의 메소드로 해당 비교를 구현하는 것 입니다. 그런 다음 수신 문자열이 nil이면 메서드가 전체적으로 반환 NO됩니다.
Defraged

50
 NSString *stringA;
 NSString *stringB;

 if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
     // match
 }

참고 : stringA && 은 ( stringA는) nil다음과 같은 이유로 필요합니다 .

 stringA = nil;
 [stringA caseInsensitiveCompare:stringB] // return 0

그래서 어떻게 NSOrderedSame또한으로 정의된다 0.

다음은 일반적인 함정입니다.

 NSString *rank = [[NSUserDefaults standardUserDefaults] stringForKey:@"Rank"];
 if ([rank caseInsensitiveCompare:@"MANAGER"] == NSOrderedSame) {
     // what happens if "Rank" is not found in standardUserDefaults
 }

46

대소 문자를 구분하지 않는 것보다 더 많은 제어를 원하는 경우의 대안은 다음과 같습니다.

[someString compare:otherString options:NSCaseInsensitiveSearch];

숫자 검색과 분음 부호는 두 가지 편리한 옵션입니다.


4
matm이 위에서 언급했듯이 someString이 nil이면 true를 반환합니다.
nh32rg

@ nh32rg if 문을 다음과 같이 변경하여 오 탐지를 보완 할 수 있을까요?if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
KingPolygon

1
실제로 두 문자열이 동일한 경우 return NSOrderSame (= 0)을 비교하므로 [... comapre : ...] == 0을 작성해야합니다. for, someString! = (id) [NSNull null], null 인 경우 길이가 0이므로 필요하다고 생각하지 않습니다. 나는 보통 다음과 같이 비교한다 : if (someString.length> 0 && [someString compare : ortherString 옵션 : NSCaseIntensitiveSearch] == 0)
Tran Quan

23

비교하기 전에 항상 같은 경우인지 확인할 수 있습니다.

if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
    // They're equal
}

nil 문자열 비교와 관련하여 matm이 설명 할 수있는 잠재적 인 문제를 피하는 것이 주된 이점입니다. compare:options:메소드 중 하나를 수행하기 전에 문자열이 0이 아닌지 확인 하거나 나처럼 게으르고 각 비교에 대해 새 문자열을 작성하는 추가 비용을 무시할 수 있습니다 (하나만 수행하는 경우 최소 임) 또는 두 가지 비교).


3
비교를 위해 케이싱을 조작하는 것은 일반적으로 현명한 일이 아닙니다 (예 : 칠면조 테스트 : moserware.com/2008/02/does-your-code-pass-turkey-test.html ). 언어 지원 사례 비교 (예 :)가있는 경우 caseInsensitiveCompare항상 사용하십시오.
하드 슈나이더

7
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

12
답변에 컨텍스트와 설명이 있으면 사람들에게 훨씬 유용합니다.
jowie

7

이를위한 새로운 방법. iOS 8

let string: NSString = "Café"
let substring: NSString = "É"

string.localizedCaseInsensitiveContainsString(substring) // true

objC 버전 : if (string && [string localizedCaseInsensitiveContainsString : substring])
ski_squaw

OP는 "대소 문자를 구분하지 않는 비교"를 요청합니다 . 귀하의 솔루션 true이 "Café"및 "É"로 돌아 오면 이것이 정답 이 아닙니다 .
Alexander Abakumov

6

이 방법을 사용해보십시오

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

심하게 게으른 제이슨 코코의 답변을 스위프트 로 변환 :)

if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
  // Strings are equal.
}

1
XCode가 자동 완성을 거부하는 사람들에게 필요합니다! : D
Nitin Alabur

5

iPhone ContactApp에서와 같이 접두사로 확인

([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)

블로그는 나에게 유용했다


1

신속한 대안 솔루션 :

대문자를 모두 만들려면 :

예 :

if ("ABcd".uppercased() == "abcD".uppercased()){
}

또는 모두 LowerCase를 만들려면 :

예 :

if ("ABcd".lowercased() == "abcD".lowercased()){
}

0

맥 OS에서 당신은 간단하게 사용할 수 있습니다 -[NSString isCaseInsensitiveLike:]반환하는 BOOL것처럼 -isEqual:.

if ([@"Test" isCaseInsensitiveLike: @"test"])
    // Success

-3
NSMutableArray *arrSearchData;  
NSArray *data=[arrNearByData objectAtIndex:i];
NSString *strValue=[NSString stringWithFormat:@"%@", [data valueForKey:@"restName"]];
NSRange r = [strValue rangeOfString:key options:NSCaseInsensitiveSearch];

if(r.location != NSNotFound)
{
     [arrSearchData addObject:data];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.