NSString hasPrefix:区分大小写的函数

Posted

技术标签:

【中文标题】NSString hasPrefix:区分大小写的函数【英文标题】:NSString hasPrefix: function with case sensitivity 【发布时间】: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) 
     // ....

【问题讨论】:

【参考方案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 :) 谢谢。 @***foe 的答案可能更合适,因为您可以选择不同的选项来查找子字符串。 这个答案修改任何字符串。【参考方案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
    


【讨论】:

以上是关于NSString hasPrefix:区分大小写的函数的主要内容,如果未能解决你的问题,请参考以下文章

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

NSString跟SwiftString的区别和使用场景

字符串搜索

Objective-C 字符串操作

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

IOS / Objective-C:使用StringByReplacingOccurrencesOfString进行不区分大小写搜索