Objective-C中的正则expression式:如何用dynamic模板replace匹配?

我的input就像"Hi {{username}}" ,即。 用关键字replace的string。 然而, input是相当小的 (~10个关键字和总共1000个字符),并且我有一百万个可能的关键字存储在散列表数据结构中,每个关联到它的replace。

因此,我不想遍历关键字列表,并尝试在input中replace每个input以显示性能原因。 我比较喜欢通过查找正则expression式模式"\{\{.+?\}\}"来遍历input字符一次。

在Java中,我使用Matcher.appendReplacementMatcher.appendTail方法来做到这一点。 但我找不到与NSRegularExpression类似的API。

 private String replaceKeywords(String input) { Matcher m = Pattern.compile("\\{\\{(.+?)\\}\\}").matcher(input); StringBuffer sb = new StringBuffer(); while (m.find()) { String replacement = getReplacement(m.group(1)); m.appendReplacement(sb, replacement); } m.appendTail(sb); return sb.toString(); } 

我是否被迫自己实施这样的API,还是我错过了什么?

你可以用NSRegularExpression来实现这个NSRegularExpression

 NSString *original = @"Hi {{username}} ... {{foo}}"; NSDictionary *replacementDict = @{@"username": @"Peter", @"foo": @"bar"}; NSString *pattern = @"\\{\\{(.+?)\\}\\}"; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL]; NSMutableString *replaced = [original mutableCopy]; __block NSInteger offset = 0; [regex enumerateMatchesInString:original options:0 range:NSMakeRange(0, original.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { NSRange range1 = [result rangeAtIndex:1]; // range of the matched subgroup NSString *key = [original substringWithRange:range1]; NSString *value = replacementDict[key]; if (value != nil) { NSRange range = [result range]; // range of the matched pattern // Update location according to previous modifications: range.location += offset; [replaced replaceCharactersInRange:range withString:value]; offset += value.length - range.length; // Update offset } }]; NSLog(@"%@", replaced); // Output: Hi Peter ... bar 

我不相信你可以直接做你想做的事。

您可以使用RegexKit Lite ,特别是stringByReplacingOccurrencesOfRegex:usingBlock:方法,其中replace块包含您的逻辑从上面的while循环find并返回适当的replace。