【发布时间】:2011-08-02 07:05:53
【问题描述】:
是否有一种方法可以返回 NSString 中出现的字母“a”的所有索引?尝试查看文档,似乎没有任何文档。所以我可能不得不将 NSString 分解为 NSArray 的字符并进行迭代?
【问题讨论】:
标签: iphone objective-c ipad
是否有一种方法可以返回 NSString 中出现的字母“a”的所有索引?尝试查看文档,似乎没有任何文档。所以我可能不得不将 NSString 分解为 NSArray 的字符并进行迭代?
【问题讨论】:
标签: iphone objective-c ipad
试试 [NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]。或者实际上,任何其他 NSRegularExpression 匹配方法。他们不会返回 NSIndexSet - 它是一个 NSTextChecking 对象的数组 - 但你可以很容易地从中获取索引。
这是一些(未经测试!)示例代码:
NSString* aString = @"Here's a string, that contains some letters a";
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"a" options:0 error:NULL];
NSArray* matches = [regex matchesInString:aString options:0 range:NSMakeRange(0,[aString length])];
for(NSTextCheckingResult* i in matches) {
NSRange range = i.range;
NSUInteger index = range.location; //the index you were looking for!
//do something here
}
使用enumerateMatchesInString其实效率更高,但不知道大家对Blocks有多熟悉,所以我选择了NSArray这种更常见的快速枚举。
更新:使用块的相同代码。
NSString* aString = @"Here's a string, that contains some letters a";
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"a";
[regex enumerateMatchesInString:aString
options:0
range:NSMakeRange(0,[aString length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSRange range = result.range;
NSUInteger index = range.location; //the index you were looking for
//do work here
}];
【讨论】:
NSString *full_string=@"The Quick Brown Fox Brown";
NSMutableArray *countloc=[[NSMutableArray alloc]init];
int temp=0;
int len=[full_string length];
for(int i =0;i<[full_string length];i++)
{
NSRange range=[full_string rangeOfString:@"Brown" options:0 range:NSMakeRange(temp,len-1)];
if(range.location<[full_string length])
[countloc addObject:[NSString stringWithFormat:@"%d",range.location]];
temp=range.location+1;
len=[full_string length]-range.location;
i=temp;
}
在这里搜索子字符串 Brown 和 子字符串的位置存储在数组countloc中
【讨论】: