gpt4 book ai didi

ios - 获取 NSString 中所有大写字母的 NSRange 对象数组的最快方法?

转载 作者:可可西里 更新时间:2023-11-01 05:02:08 28 4
gpt4 key购买 nike

我需要 NSRange 对象来获取给定 NSString 中每个大写字母的位置,以便将其输入到自定义属性字符串类的方法中。

当然有很多方法可以实现这一点,例如 rangeOfString:options: 使用 NSRegularExpressionSearch 或使用 RegexKitLite 在遍历字符串时分别获取每个匹配项。

完成此任务最快的执行方法是什么?

最佳答案

最简单的方法可能是使用 -rangeOfCharacterFromSet:options:range:[NSCharacterSet uppercaseLetterCharacterSet]。通过修改每次调用的搜索范围,您可以很容易地找到所有大写字母。像下面这样的东西会给你一个所有范围的 NSArray(编码为 NSValues):

- (NSArray *)rangesOfUppercaseLettersInString:(NSString *)str {
NSCharacterSet *cs = [NSCharacterSet uppercaseLetterCharacterSet];
NSMutableArray *results = [NSMutableArray array];
NSRange searchRange = NSMakeRange(0, [str length]);
NSRange range;
while ((range = [str rangeOfCharacterFromSet:cs options:0 range:searchRange]).location != NSNotFound) {
[results addObject:[NSValue valueWithRange:range]];
searchRange = NSMakeRange(NSMaxRange(range), [str length] - NSMaxRange(range));
}
return results;
}

请注意,这不会将相邻范围合并为一个范围,但添加起来很容易。

这是基于 NSScanner 的替代解决方案:

- (NSArray *)rangesOfUppercaseLettersInString:(NSString *)str {
NSCharacterSet *cs = [NSCharacterSet uppercaseLetterCharacterSet];
NSMutableArray *results = [NSMutableArray array];
NSScanner *scanner = [NSScanner scannerWithString:str];
while (![scanner isAtEnd]) {
[scanner scanUpToCharactersFromSet:cs intoString:NULL]; // skip non-uppercase characters
NSString *temp;
NSUInteger location = [scanner scanLocation];
if ([scanner scanCharactersFromSet:cs intoString:&temp]) {
// found one (or more) uppercase characters
NSRange range = NSMakeRange(location, [temp length]);
[results addObject:[NSValue valueWithRange:range]];
}
}
return results;
}

与上一个不同,这个确实将相邻的大写字符合并到一个范围内。

编辑:如果您正在寻找绝对速度,这个可能是这里介绍的 3 个中最快的,同时仍然保留正确的 unicode 支持(注意,我没有尝试编译这个) :

// returns a pointer to an array of NSRanges, and fills in count with the number of ranges
// the buffer is autoreleased
- (NSRange *)rangesOfUppercaseLettersInString:(NSString *)string count:(NSUInteger *)count {
NSMutableData *data = [NSMutableData data];
NSUInteger numRanges = 0;
NSUInteger length = [string length];
unichar *buffer = malloc(sizeof(unichar) * length);
[string getCharacters:buffer range:NSMakeRange(0, length)];
NSCharacterSet *cs = [NSCharacterSet uppercaseLetterCharacterSet];
NSRange range = {NSNotFound, 0};
for (NSUInteger i = 0; i < length; i++) {
if ([cs characterIsMember:buffer[i]]) {
if (range.location == NSNotFound) {
range = (NSRange){i, 0};
}
range.length++;
} else if (range.location != NSNotFound) {
[data appendBytes:&range length:sizeof(range)];
numRanges++;
range = (NSRange){NSNotFound, 0};
}
}
if (range.location != NSNotFound) {
[data appendBytes:&range length:sizeof(range)];
numRanges++;
}
if (count) *count = numRanges;
return [data bytes];
}

关于ios - 获取 NSString 中所有大写字母的 NSRange 对象数组的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4653232/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com