有没有人可以给我提供一些关于 Objective C 中不区分大小写比较的资源?它似乎没有类似于 str1.equalsIgnoreCase(str2)
的方法。
有没有人可以给我提供一些关于 Objective C 中不区分大小写比较的资源?它似乎没有类似于 str1.equalsIgnoreCase(str2)
的方法。
if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
// strings are equal except for possibly case
}
文档位于搜索和比较方法
NSString *stringA;
NSString *stringB;
if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
// match
}
注意: 因为当stringA
为nil
时,stringA &&
是必须的。
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
}
如果您想要比仅使用大小写不敏感性更多的控制权,则可以使用以下方法:
[someString compare:otherString options:NSCaseInsensitiveSearch];
数字搜索和重音不敏感性是两个方便的选项。
if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null])
的内容来弥补假阳性的问题? - KingPolygon在比较之前,您可以始终确保它们处于相同的大小写:
if ([[stringX uppercaseString] isEqualToString:[stringY uppercaseString]]) {
// They're equal
}
主要的好处是避免了 matm 提到的比较空字符串时可能出现的问题。你可以在使用 compare:options:
方法之前先检查字符串是否为 nil,或者像我一样懒惰,忽略每次比较都创建新字符串的额外成本(如果只进行一两次比较,则成本最小)。iOS 8带来了一种全新的做法。
let string: NSString = "Café"
let substring: NSString = "É"
string.localizedCaseInsensitiveContainsString(substring) // true
true
,那么这绝对不是正确答案。 - Alexander Abakumov- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
以下是将Jason Coco的回答转换为Swift的方法,适用于极度懒惰的人们 :)
if ("Some String" .caseInsensitiveCompare("some string") == .OrderedSame)
{
// Strings are equal.
}
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
需要检查像iPhone ContactApp中的前缀。
([string rangeOfString:prefixString options:NSCaseInsensitiveSearch].location == 0)
这篇博客对我很有用
Swift的备选解决方案:
将两者都转换为大写字母:
e.g:
if ("ABcd".uppercased() == "abcD".uppercased()){
}
e.g:
if ("ABcd".lowercased() == "abcD".lowercased()){
}
@"Some String"
时恰好为nil
,那么您的if
语句将返回true
,因为向nil
发送caseInsensitiveCompare
是有效的,并会导致得到另一个nil
,而在我们的情况下,与NSOrderedSame
进行比较将返回true
(NSOrderedSame
被定义为 0)。这可能是相当严重的错误来源,正如在我的情况下一样。谢谢! - matmNSString
的一个分类中实现该比较为一个方法,并返回一个布尔值。如果接收到的字符串是nil
,则整个方法将返回NO
。 - Defragged