【问题标题】:NSString hasPrefix: function with case sensitivityNSString hasPrefix:区分大小写的函数
【发布时间】:2014-02-24 12:47:30
【问题描述】:

简单,可能会问很多次,但这个小技巧。我们知道,NSString 对 hasPrefix: 方法不区分大小写。

NSString *string = @"Xyzabcdedfghij";
    NSString *substring = @"xyz";
    if ([string hasPrefix:substring])
        NSLog(@"string has prefix "); // won't get here.

Question is: 有没有解决这个问题的内置方法?我的意思是,hasPrefix: 区分大小写?

我至少可以使用以下答案。但是想知道是否有比这更好的方法..?

已知答案:(租赁案例)

if ([[test substringWithRange:NSMakeRange(0,3)] caseInsensitiveCompare:@"xyz"] == NSOrderedSame) {
     // ....
}

【问题讨论】:

    标签: ios objective-c nsstring


    【解决方案1】:

    来自Apple自己:

    NSString *searchString = @"age";
    
    NSString *beginsTest = @"Agencies";
    NSRange prefixRange = [beginsTest rangeOfString:searchString
        options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
    
    // prefixRange = {0, 3}
    
    NSString *endsTest = @"BRICOLAGE";
    NSRange suffixRange = [endsTest rangeOfString:searchString
        options:(NSAnchoredSearch | NSCaseInsensitiveSearch | NSBackwardsSearch)];
    
    // suffixRange = {6, 3}
    

    这可以包装成一个易于使用的方法:

    - (BOOL) string:(NSString *)string
          hasPrefix:(NSString *)prefix
    caseInsensitive:(BOOL)caseInsensitive {
    
        if (!caseInsensitive)
            return [string hasPrefix:prefix];
    
        const NSStringCompareOptions options = NSAnchoredSearch|NSCaseInsensitiveSearch;
        NSRange prefixRange = [string rangeOfString:prefix
                                            options:options];
        return prefixRange.location == 0 && prefixRange.length > 0;
    }
    

    【讨论】:

    • 如果有其他方法可以做到这一点,我会跟着你。但我仍在搜索,任何其他方式来做到这一点......任何方式+1这将有助于未来的访问者:)
    • @iMani 除了您在问题中显示的替代方案和沃尔克的回答之外,我怀疑还有更多替代方案。
    • 是的,我也在等那个。如果有其他方法可以轻松完成,而无需计算范围。
    • @iMani 我已经用您可以添加的方法更新了我的答案,这意味着您不需要处理范围,您可以忘记它们。
    • 为什么这比 [[string lowercaseString] hasPrefix:[substring lowercaseString]] 好?它至少更快吗?
    【解决方案2】:

    您始终可以在两个字符串上使用lowercaseString,从而强制使用相同的大小写。比如

    [[string lowercaseString] hasPrefix:[substring lowercaseString]];
    

    【讨论】:

    • 它会起作用的。但我不想修改任何字符串。谢谢沃尔克..为你+1 :)
    • 谢谢。 @trojanfoe 的答案可能更合适,因为您可以选择不同的选项来查找子字符串。
    • 这个答案修改任何字符串。
    【解决方案3】:

    讨厌的做法是将两个字符串都小写,然后使用 hasPrefix 例如

    [[mainString lowercaseString] hasPrefix:[stringToFind lowercaseString]];
    

    【讨论】:

    • 这与沃尔克的回答有何不同?
    【解决方案4】:

    你可以这样做

    if([[string lowercaseString] hasPrefix:[substring lowercaseString]])
    {
    NSLog(@"found");
    }
    

    【讨论】:

    • 只有在上面的例子中它才会这样工作。两个字符串都需要lowercaseString 的稳定版本!
    【解决方案5】:

    已接受答案的 Swift 4.2 版本:

    extension String {
    
        public func hasPrefix<Prefix>(_ prefix: Prefix, caseSensitive: Bool) -> Bool where Prefix : StringProtocol {
    
            if caseSensitive { return self.hasPrefix(prefix) }
    
            let prefixRange = self.range(of: prefix, options: [.anchored, .caseInsensitive])
            return prefixRange != nil
        }
    }
    

    或者,使用.lowercased()

    extension String {
    
        public func hasPrefix<Prefix>(_ prefix: Prefix, caseSensitive: Bool) -> Bool where Prefix : StringProtocol {
    
            if caseSensitive { return self.hasPrefix(prefix) }
            return self.lowercased().hasPrefix(prefix.lowercased())
        }
    }
    

    扩展名如下使用

    let string = "Hello World"
    
    let caseSensitiveSearch = string.hasPrefix("hello", caseSensitive: true) // return false
    let caseNotSensitiveSearch = string.hasPrefix("hello", caseSensitive: false) // return true
    

    【讨论】:

      【解决方案6】:

      斯威夫特 5:

      extension String {
          public func hasPrefixIgnoringCase(_ prefix: String) -> Bool {
              range(of: prefix, options: [.anchored, .caseInsensitive]) != nil
          }
      }
      

      用法:

      "Hello".hasPrefixIgnoringCase("hEl") // return true
      

      【讨论】:

        【解决方案7】:

        对于那些喜欢功能风格单线的人(就像我一样):

        extension String {
        
            func hasPrefix<Prefix>(_ prefix: Prefix, caseSensitive: Bool) -> Bool where Prefix: StringProtocol {
                return caseSensitive ? hasPrefix(prefix) :
                    self.range(of: prefix, options: [.anchored, .caseInsensitive]) != nil
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2011-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          相关资源
          最近更新 更多