【问题标题】:Case insensitive comparison NSString不区分大小写的比较 NSString
【发布时间】:2010-04-06 02:20:25
【问题描述】:

任何人都可以向我指出有关 Objective C 中不区分大小写比较的任何资源吗?它似乎没有与str1.equalsIgnoreCase(str2)等效的方法

【问题讨论】:

    标签: ios objective-c cocoa-touch nsstring


    【解决方案1】:
    if( [@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
      // strings are equal except for possibly case
    }
    

    文档位于Search and Comparison Methods

    【讨论】:

    • 值得一提的是,如果从任何其他电话收到@"Some String",恰好是nil,您的if 将把true 作为发送caseInsensitiveCompare 给@987654328 @ 是有效的,并导致另一个 nil,在我们的例子中,与 NSOrderedSame 相比,将返回 trueNSOrderedSame 定义为 0)。这可能是非常具有破坏性的错误的来源,就像我的情况一样。干杯!
    • 我的解决方法是将该比较实现为NSString 上的一个类别内的一个方法,该方法返回一个布尔值。那么如果接收字符串为nil,则方法整体返回NO
    【解决方案2】:
     NSString *stringA;
     NSString *stringB;
    
     if (stringA && [stringA caseInsensitiveCompare:stringB] == NSOrderedSame) {
         // match
     }
    

    注意: stringA && 是必需的,因为当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
     }
    

    【讨论】:

      【解决方案3】:

      如果您想要更多控制而不仅仅是不区分大小写,另一种方法是:

      [someString compare:otherString options:NSCaseInsensitiveSearch];
      

      数字搜索和变音不敏感是两个方便的选项。

      【讨论】:

      • 正如 matm 上面提到的,如果 someString 为 nil,这将返回 true。
      • @nh32rg 你可以通过将 if 语句更改为 if ([someString compare:otherString options:NSCaseInsensitiveSearch] && someString.length > 0 && someString != (id)[NSNull null]) 之类的东西来弥补误报吗?
      • 实际上,你需要写 [...comapre:...] == 0,因为如果两个字符串相同,比较返回 NSOrderSame (=0)。对于, someString != (id)[NSNull null],我认为不需要,因为如果为 null,那么长度为零。我通常这样比较: if (someString.length > 0 && [someString compare:ortherString options:NSCaseIntensitiveSearch] == 0)
      【解决方案4】:

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

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

      主要好处是您避免了 matm 描述的关于比较 nil 字符串的潜在问题。您可以在执行 compare:options: 方法之一之前检查字符串是否为 nil,或者您可以懒惰(像我一样)并忽略为每次比较创建新字符串的额外成本(如果您是只做一两次比较)。

      【讨论】:

      【解决方案5】:

      一种新的方式来做到这一点。 iOS 8

      let string: NSString = "Café"
      let substring: NSString = "É"
      
      string.localizedCaseInsensitiveContainsString(substring) // true
      

      【讨论】:

      • objC 版本:if( string && [string localCaseInsensitiveContainsString:substring] )
      • OP 要求 “不区分大小写的比较”。如果您的解决方案为“Café”和“É”返回 true,这绝对是 NOT 正确答案。
      【解决方案6】:
      - (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
      

      【讨论】:

      • 如果答案有一些上下文和描述,它对人们更有用。
      【解决方案7】:

      试试这个方法

      - (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
      

      【讨论】:

        【解决方案8】:

        将 Jason Coco 的答案转换为 Swift,供极度懒惰的人使用:)

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

        【讨论】:

        • 那些 XCodes 拒绝自动完成的人需要它! :D
        【解决方案9】:

        在 iPhone ContactApp 中检查前缀

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

        this 博客对我很有用

        【讨论】:

          【解决方案10】:

          swift 的替代解决方案:

          将两者都设为大写:

          例如:

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

          或将两者都设为小写:

          例如:

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

          【讨论】:

            【解决方案11】:

            在 macOS 上,您可以简单地使用 -[NSString isCaseInsensitiveLike:],它返回 BOOL,就像 -isEqual: 一样。

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

            【讨论】:

              【解决方案12】:
              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];
              }
              

              【讨论】:

                猜你喜欢
                • 2011-05-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-04-18
                • 2013-03-11
                • 2020-03-28
                相关资源
                最近更新 更多