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:区分大小写的函数的主要内容,如果未能解决你的问题,请参考以下文章
IOS / Objective-C:使用StringByReplacingOccurrencesOfString进行不区分大小写搜索