2012-03-08 26 views
6

Tôi muốn tìm tất cả các lần xuất hiện của chuỗi con trong một NSString và lặp lại từng chuỗi một để thực hiện một số thay đổi đối với NSString đó. Tôi nên làm như thế nào?Iphone lặp qua chuỗi xuất hiện của NSString

+0

Bạn có nghĩa là nếu bạn có '@" abcabcabcabcabcabc "' bạn muốn lặp qua tất cả '@" abc "' s? – mattjgalloway

+0

vâng, đúng vậy. –

Trả lời

12

Làm thế nào về

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

Hoặc chỉ cần

[sourceString stringByReplacingOccurrencesOfString:searchString withString:targetString]; 

nếu bạn muốn thay đổi searchString để cùng giá trị ở khắp mọi nơi trong chuỗi nguồn.

+0

Cũng sử dụng: NSArray * stringArray = [myString componentsSeparatedByString: @ "mySubString"]; –

+0

Tôi khai thác sai phím và câu trả lời của tôi đã được gửi không đầy đủ lúc đầu :-) – TheEye

+2

Bằng các thành phầnĐược loại bỏ ... bạn xóa tất cả các lần xuất hiện của chuỗi tìm kiếm, bạn không lặp lại chúng ... – TheEye

6

tôi sẽ đi với một cái gì đó như thế này:

// 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); 
+0

đó là cách phức tạp, có một phương pháp cho rằng: '- (void) enumerateSubstringsInRange: (NSRange) phạm vi tùy chọn: (NSStringEnumerationOptions) opts usingBlock: (void (^) (NSString * substring, NSRange substringRange, NSRange enclosingRange, BOOL * stop)) block'. – calimarkus

+0

Đó là một điểm rất tốt. 1 trên câu trả lời của bạn cho điều đó. – mattjgalloway

+0

Rất hữu ích sau khi tìm kiếm rất nhiều. Cảm ơn. +1 –

1

Bạn có thể muốn có một cái nhìn vào NSString class Documentation.

Nhân vật Tìm và chuỗi con

– rangeOfCharacterFromSet: 
– rangeOfCharacterFromSet:options: 
– rangeOfCharacterFromSet:options:range: 
– rangeOfString: 
– rangeOfString:options: 
– rangeOfString:options:range: 
– rangeOfString:options:range:locale: 
– enumerateLinesUsingBlock: 
– enumerateSubstringsInRange:options:usingBlock: 

Chia Strings

– componentsSeparatedByString: 
– componentsSeparatedByCharactersInSet: 
– stringByTrimmingCharactersInSet: 
– substringFromIndex: 
– substringWithRange: 
– substringToIndex: 
5

Nếu bạn muốn làm thay đổi, bạn có thể sử dụng:

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

nhưng nếu điều đó không phù hợp với nhu cầu của bạn thử điều này:

- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block

+0

Xem tài liệu, như được ghi nhận bởi HelmiB. – calimarkus

0

Mở rộng trên @ TheEye của answer, tôi nấu này lên:

@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 
Các vấn đề liên quan