如何在字符串中搜索特定子字符串并找到每个匹配项的位置。
例如,
NSString *theText = @"name - dave, age - 30, favNum - 7, name - peter, age - 8, favNum - 10";
在这个例子中,我试图找到所有年龄并用50替换它们。这样做的最佳方法是什么?
答案 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来实现类似的东西 - 代码会少一些,但是它的可读性会降低。