简单而且可能会问很多时间,但这个小技巧。我们知道,对于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) {
// ....
}
答案 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