与一堆字符串比较不区分大小写

Posted

技术标签:

【中文标题】与一堆字符串比较不区分大小写【英文标题】:Case insensitive compare against bunch of strings 【发布时间】:2010-07-11 07:51:04 【问题描述】:

将 NSString 与其他不区分大小写的字符串进行比较的最佳方法是什么?如果它是字符串之一,则该方法应返回 YES,否则返回 NO。

【问题讨论】:

【参考方案1】:

这是一个小辅助函数:

BOOL isContainedIn(NSArray* bunchOfStrings, NSString* stringToCheck)

    for (NSString* string in bunchOfStrings) 
        if ([string caseInsensitiveCompare:stringToCheck] == NSOrderedSame)
            return YES;
    
    return NO;

当然,这可以针对不同的用例进行极大优化。

例如,如果您对常量 bundleOfStrings 进行大量检查,您可以使用 NSSet 来保存字符串的小写版本并使用 containsObject:

BOOL isContainedIn(NSSet* bunchOfLowercaseStrings, NSString* stringToCheck)

    return [bunchOfLowercaseStrings containsObject:[stringToCheck lowercaseString]];

【讨论】:

谢谢。我特别在寻找类似 caseInsensitiveCompare:【参考方案2】:

只是为 Nikolai 的回答添加一些补充:

NSOrderedSame 定义为 0

typedef NS_ENUM(NSInteger, NSComparisonResult) NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending;

因此,如果您在 nil 对象上调用 caseInsensitiveCompare:,您将得到 nil。然后你将nilNSOrderSame(为0)进行比较,你会得到一个当然是错误的匹配。

您还必须检查传递给caseInsensitiveCompare: 的参数是否必须不为零。来自documentation:

这个值不能为零。如果此值为 nil,则行为为 未定义,可能会在未来的 OS X 版本中发生变化。

【讨论】:

以上是关于与一堆字符串比较不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

如何进行不区分大小写的字符串比较?

Go中不区分大小写的字符串比较

mysql字符串区分大小写的问题

javascript比较字符串而不区分大小写[重复]

PostgreSQL:不区分大小写的字符串比较

字符串比较时如何将Sqlite3设置为不区分大小写?