NSString中子字符串的出现次数?
如何获得NSString(例如, @"cake"
)在较大的NSString中出现的次数(例如@"Cheesecake, apple cake, and cherry pie"
)?
我需要在很多字符串上执行此操作,因此无论使用什么方法,都需要相对较快。
谢谢!
这没有经过测试,但应该是一个好的开始。
NSUInteger count = 0, length = [str length];
NSRange range = NSMakeRange(0, length);
while(range.location != NSNotFound)
{
range = [str rangeOfString: @"cake" options:0 range:range];
if(range.location != NSNotFound)
{
range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
count++;
}
}
像下面这样的正则表达式应该在没有循环交互的情况下完成这项工作......
编辑
NSString *string = @"Lots of cakes, with a piece of cake.";
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"cake" options:NSRegularExpressionCaseInsensitive error:&error];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, [string length])];
NSLog(@"Found %i",numberOfMatches);
仅适用于iOS 4.x和上级。
正在寻找一种更好的方法,但我的另一个例子是:
NSString *find = @"cake";
NSString *text = @"Cheesecake, apple cake, and cherry pie";
NSInteger strCount = [text length] - [[text stringByReplacingOccurrencesOfString:find withString:@""] length];
strCount /= [find length];
我想知道哪一个更有效。
我为了更好的使用而创建了一个NSString
类别:
// NSString+CountString.m
@interface NSString (CountString)
- (NSInteger)countOccurencesOfString:(NSString*)searchString;
@end
@implementation NSString (CountString)
- (NSInteger)countOccurencesOfString:(NSString*)searchString {
NSInteger strCount = [self length] - [[self stringByReplacingOccurrencesOfString:searchString withString:@""] length];
return strCount / [searchString length];
}
@end
只需按以下方式调用它
[text countOccurencesOfString:find];
可选:您可以修改它以通过定义options:
来搜索不区分大小写options: