搜索字符串中的多个字符串

时间:2011-06-29 15:49:21

标签: iphone objective-c cocoa-touch

如何在字符串中搜索特定子字符串并找到每个匹配项的位置。

例如,

NSString *theText = @"name - dave, age - 30, favNum - 7, name - peter, age - 8, favNum - 10";

在这个例子中,我试图找到所有年龄并用50替换它们。这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

NSRegularExpression仅在iOS 4.0中可用,并且该字符串应该具有可预测的正则表达式,因此可以猜测。

NSString *theText = @"name - dave, age - 30, favNum - 7, name - peter, age - 8, favNum - 10";
NSRegularExpression * regularExpression = [NSRegularExpression regularExpressionWithPattern:@"(?<= age - )\\d+"
                                                                                    options:0
                                                                                      error:nil];

NSString * alteredText = [regularExpression stringByReplacingMatchesInString:theText
                                                                     options:0
                                                                       range:NSMakeRange(0, [theText length])
                                                                withTemplate:@"50"];

NSLog(@"%@", alteredText);

以上代码有效。你必须看看它是否适合你的HTML用例。

获得年龄

您将使用enumerateMatchesInString:options:range:usingBlock:方法枚举所有匹配项。每次迭代都会得到一个NSTextCheckingResult对象,它将保存有关匹配的范围信息。因此,在替换字符串之前,您需要执行此操作。您可以在数组中获取年龄

NSMutableArray * ages = [NSMutableArray array];
[regularExpression enumerateMatchesInString:theText
                                    options:0
                                      range:NSMakeRange(0, [theText length])
                                 usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop){
                                     [ages addObject:[NSNumber numberWithInt:[[theText substringWithRange:result.range] intValue]]];
                                 }];

NSLog(@"%@", ages);

答案 1 :(得分:0)

您必须反汇编字符串然后重建它。无法替换NSString中的字符。

首先,您需要将字符串拆分为组件。使用NSString的-(NSArray*)componentsSeperatedByString(@"age")-(NSArray*)componentsSeperatedByString(@",")来删除您的记录。但是,获得数字需要更多的工作。使用NSScanner。

使用要扫描的字符串创建NSScanner:+ (id)scannerWithString:(NSString *)aString。因此,您将遍历上面返回的数组并扫描字符串然后扫描整数。

要覆盖字符串,你需要使用 - (BOOL)scanCharactersFromSet:(NSCharacterSet )scanSet intoString:(NSString * )stringValue  使用字符集:[[NSCharacterSet decimalDigitCharacterSet] inverseCharacterSet] - 这是charachter集合,包括除数字之外的所有字符。请注意,range中的scanCharacters会返回它扫描的字符,因此您可以使用它来重建字符串。

然后您可以使用NSScanner的- (BOOL)scanInt:(int *)intValue

扫描整数

你可以使用NSPredicate和regexp来实现类似的东西 - 代码会少一些,但是它的可读性会降低。