【问题标题】:Iphone iterate over substring occurrences of a NSStringIphone 遍历 NSString 的子字符串出现
【发布时间】:2012-03-08 10:06:25
【问题描述】:

我想在 NSString 中找到所有出现的子字符串,并一一迭代以对该 NSString 进行一些更改。我该怎么做?

【问题讨论】:

  • 你的意思是如果你有@"abcabcabcabcabcabc",你想遍历所有的@"abc"s?

标签: iphone nsstring


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2019-05-25
      • 2012-07-29
      • 2015-03-30
      • 2021-10-17
      • 1970-01-01
      • 2018-10-01
      • 2011-05-01
      相关资源
      最近更新 更多