iPhone如何迭代遍历NSString中的子字符串出现次数?

6
我想在一个NSString中查找所有子字符串的出现位置,并逐个迭代对该NSString进行一些更改。我应该怎么做?

你的意思是如果你有@"abcabcabcabcabcabc",你想要遍历所有的@"abc"吗? - mattjgalloway
5个回答

12

怎么样?

// 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];

如果你想要在源字符串中将搜索字符串的值随处更改为相同的值。


同时使用:NSArray *stringArray = [myString componentsSeparatedByString:@"mySubString"]; - Luis Andrés García
我误触了错误的按键,导致我的答案一开始就发送不完整 :-) - TheEye
2
通过 componentsSeparated...,您可以移除所有搜索字符串的出现次数,而不必迭代它们... - TheEye

7
我建议您采用类似以下的内容:

我会选择这样的一种方案:

// 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 - calimarkus
在搜索了很多之后非常有帮助。谢谢。+1 - Prerna chavan
Matt的方法允许您更改字符串,因为它没有被枚举。 - Stephen J

5

如果你想进行更改,可以使用以下方法:

- (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 所指出的文档。 - calimarkus

1

你可能想要查看NSString类文档

查找字符和子字符串

 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:

0

在 @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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接