Iphone 遍历 NSString 的子字符串出现
Posted
技术标签:
【中文标题】Iphone 遍历 NSString 的子字符串出现【英文标题】:Iphone iterate over substring occurrences of a NSString 【发布时间】:2012-03-08 10:06:25 【问题描述】:我想在 NSString 中找到所有出现的子字符串,并一一迭代以对该 NSString 进行一些更改。我该怎么做?
【问题讨论】:
你的意思是如果你有@"abcabcabcabcabcabc"
,你想遍历所有的@"abc"
s?
【参考方案1】:
怎么样
// find first occurrence of search string in source string
NSRange range = [sourceString rangeOfString:@"searchString"];
while(range.location != NSNotFound)
// build a new string with your changed values
range = [sourceString rangeOfString:@"searchString" options:0 range:NSMakeRange(range.location + 1, [sourceString length] - range.location - 1)];
或者只是
[sourceString stringByReplacingOccurrencesOfString:searchString withString:targetString];
如果您想将源字符串中的 searchString 更改为相同的值。
【讨论】:
同时使用:NSArray *stringArray = [myString componentsSeparatedByString:@"mySubString"]; 我敲错了键,一开始我的答案不完整:-) 通过 componentsSeparated... 您删除所有出现的搜索字符串,您不会遍历它们...【参考方案2】:我会选择这样的:
// Setup what you're searching and what you want to find
NSString *string = @"abcabcabcabc";
NSString *toFind = @"abc";
// Initialise the searching range to the whole string
NSRange searchRange = NSMakeRange(0, [string length]);
do
// Search for next occurrence
NSRange range = [string rangeOfString:toFind options:0 range:searchRange];
if (range.location != NSNotFound)
// If found, range contains the range of the current iteration
// NOW DO SOMETHING WITH THE STRING / RANGE
// Reset search range for next attempt to start after the current found range
searchRange.location = range.location + range.length;
searchRange.length = [string length] - searchRange.location;
else
// If we didn't find it, we have no more occurrences
break;
while (1);
【讨论】:
这太复杂了,有一种方法:- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block
。
经过大量搜索后非常有帮助。谢谢。 +1
Matt 的方法允许您更改字符串,因为它没有被枚举。【参考方案3】:
如果您想进行更改,可以使用:
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
但如果这不符合您的需求,请尝试以下操作:
- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block
【讨论】:
查看文档,如 HelmiB 所述。【参考方案4】:你可能想看看NSString class Documentation。
查找字符和子字符串
– rangeOfCharacterFromSet:
– rangeOfCharacterFromSet:options:
– rangeOfCharacterFromSet:options:range:
– rangeOfString:
– rangeOfString:options:
– rangeOfString:options:range:
– rangeOfString:options:range:locale:
– enumerateLinesUsingBlock:
– enumerateSubstringsInRange:options:usingBlock:
分割字符串
– componentsSeparatedByString:
– componentsSeparatedByCharactersInSet:
– stringByTrimmingCharactersInSet:
– substringFromIndex:
– substringWithRange:
– substringToIndex:
【讨论】:
【参考方案5】:在@TheEye 的answer 上扩展,我做了这个:
@interface NSString (EnumerateOccurancesOfString)
- (void)enumerateOccurancesOfString:(NSString *)string usingBlock:(void (^)(NSRange substringRange, BOOL *stop))block;
@end
-
@implementation NSString (EnumerateOccurancesOfString)
- (void)enumerateOccurancesOfString:(NSString *)string usingBlock:(void (^)(NSRange range, BOOL * _Nonnull stop))block
NSParameterAssert(block);
NSRange range = [self localizedStandardRangeOfString:string];
if (range.location == NSNotFound) return;
// Iterate all occurances of 'string'
while (range.location != NSNotFound)
BOOL stop = NO;
block(range, &stop);
if (stop)
break;
// Continue the iteration
NSRange nextRange = NSMakeRange(range.location + 1, self.length - range.location - 1);
range = [self rangeOfString:string options:(NSStringCompareOptions)0 range:nextRange locale:[NSLocale currentLocale]]; // Will this sometimes conflict with the initial range obtained with -localizedStandardRangeOfString:?
@end
【讨论】:
以上是关于Iphone 遍历 NSString 的子字符串出现的主要内容,如果未能解决你的问题,请参考以下文章
使用 unicode 字符查找 NSString 的子字符串范围
如何将html代码附加到iphone中的NSString变量