NSString hasPrefix:具有区分大小写的功能

时间:2014-02-24 12:47:30

标签: ios objective-c nsstring

简单而且可能会问很多时间,但这个小技巧。我们知道,对于hasPrefix:method,NSString不兼容区分大小写。

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) {
     // ....
}

7 个答案:

答案 0 :(得分:31)

来自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 :(得分:25)

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

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

答案 2 :(得分:8)

令人讨厌的方法是小写两个字符串并使用hasPrefix 例如

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

答案 3 :(得分:4)

你可以通过

来做到这一点
if([[string lowercaseString] hasPrefix:[substring lowercaseString]])
{
NSLog(@"found");
}

答案 4 :(得分:1)

已接受答案的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

答案 5 :(得分:0)

对于那些喜欢函数式单行代码的人(像我一样):

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
    }

}

答案 6 :(得分:0)

迅速5:

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

用法:

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