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

Man*_*ani 7 objective-c nsstring ios

简单,可能会问很多时间,但这个小技巧.我们知道,NSString不适用于hasPrefix:方法的区分大小写.

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

Question is: 是否有任何内置方法可以解决此问题?我的意思是,hasPrefix:区分大小写?

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

已知答案:(租赁案例)

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

tro*_*foe 32

来自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}
Run Code Online (Sandbox Code Playgroud)

这可以包含在一个易于使用的方法中:

- (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;
}
Run Code Online (Sandbox Code Playgroud)


Vol*_*ker 27

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

[[string lowercaseString] hasPrefix:[substring lowercaseString]];
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不会**修改任何字符串. (8认同)

Jan*_*mal 8

讨厌的方法是小写两个字符串,而不是使用hasPrefix例如

[[mainString lowercaseString] hasPrefix:[stringToFind lowercaseString]];
Run Code Online (Sandbox Code Playgroud)

  • 这与Volker的答案有何不同? (2认同)

Ala*_*din 6

斯威夫特5:

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

用法:

"Hello".hasPrefixIgnoringCase("hEl") // return true
Run Code Online (Sandbox Code Playgroud)