不区分大小写的比较NSString


Answers:


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

该文档位于“ 搜索和比较方法”中


152
值得一提的是,在情况下,当@"Some String"从任何其他呼叫接收并恰好是nil,你if会给true像发送caseInsensitiveComparenil是有效的,在另一个领域的结果nil,在我们的情况下,比较了NSOrderedSame将返回trueNSOrderedSame定义为0)。就我而言,这可能是相当具有破坏性的错误的来源。干杯!
2011年

10
我的解决方法是将该比较实现为NSString返回布尔值的类别中的一种方法。然后,如果接收字符串为nil,则整个方法返回NO
2013年

50
 NSString *stringA;
 NSString *stringB;

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

注意: stringA &&是必需的,因为when stringAnil

 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 2013年

@ nh32rg您可以通过将if语句更改为类似的内容来if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
弥补误报

1
实际上,您需要编写[... comapre:...] == 0,因为如果两个字符串相同,则compare返回NSOrderSame(= 0)。例如,someString!=(id)[NSNull null],我认为这不是必需的,因为如果为null,则长度为零。我通常这样比较:if(someString.length> 0 && [someString compare:ortherString options:NSCaseIntensitiveSearch] == 0)
Tran Quan

23

在进行比较之前,您始终可以确保它们处于同一情况:

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

主要好处是您避免了matm描述的有关比较零字符串的潜在问题。您可以在执行其中一种compare:options:方法之前检查字符串是否为nil ,或者您可以像我一样懒惰,并忽略为每个比较创建新字符串的额外费用(如果您仅执行一个操作,这是最小的)或两个比较)。


3
操纵外壳进行比较通常不是明智的选择(例如,土耳其测试:moserware.com/2008/02/does-your-code-pass-turkey-test.html)。如果您有语言支持的大小写比较(例如caseInsensitiveCompare),请始终使用它。
Ohad Schneider

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

12
如果答案具有一定的上下文和描述,对人们来说将更加有用。
jowie 2012年

7

一种新的方法。iOS 8

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

string.localizedCaseInsensitiveContainsString(substring) // true

objC版本:if(string && [string localizedCaseInsensitiveContainsString:substring])
ski_squaw 2015年

OP要求“不区分大小写的比较”。如果您的解决方案返回true“Café”和“É”,则绝对不是正确的答案。
亚历山大·阿巴库莫夫

6

试试这个方法

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

6

将Jason Coco的答案转换为Swift的深奥懒惰:)

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

1
XCodes拒绝自动完成的用户需要它!:D
Nitin Alabur '17

5

使用iPhone ContactApp中的前缀进行检查

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

这个博客对我有用


1

快速的替代解决方案:

制作两个UpperCase:

例如:

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

或同时使用LowerCase:

例如:

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

0

在macOS上,您可以简单地使用-[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];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.