2

我想用enumerateMatchInString调用我的方法来查找每个缩写词ConvertAbbreviation:(NSString *)abbr;来隐藏该缩写词并返回完整的字符串。

有人可以帮我弄这个吗?当我尝试下面的代码时出现异常。如果这是错误的,请给我一个如何修改块内原始文本的示例。

- (NSString *) convertAllAbbreviationsToFullWords:(NSString *) textBlock {

NSRegularExpression *matchAnyPotentialAbv  = [NSRegularExpression regularExpressionWithPattern:@"[a-zA-Z\\.]+\\.\\s" options:0 error:nil];

[matchAnyPotentialAbv 
     enumerateMatchesInString:textBlock
     options:0
     range:NSMakeRange(0, [textBlock length])
     usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {

        /* on each match, I would like to call convert(match) and
           replace the result with the existing match in my textBlock */ 

        if (++count >= 200) *stop = YES;
     }
     ];
    return textBlock;
}
4

2 回答 2

13

您应该尝试向后搜索,否则一旦您第一次修改文本,您的文本范围就不再有效。

因此,像这样枚举所有匹配项(您可以使用此技巧向后退):

NSArray *results = [matchAnyPotentialAbv matchesInString:textBlock options:kNilOptions range:NSMakeRange(0, textBlock.length)];

for(NSTextCheckingResult *result in [results reverseObjectEnumerator])
{
    //Replace
}
于 2012-07-08T02:16:27.800 回答
2

使用 NSRegularExpression 的-replacementStringForResult:inString:offset:template:]API 可能提供了一种更简洁的方法来做到这一点,并且对我来说效果很好。有关使用指南,请参阅:

如何使用 NSRegularExpression 的 replacementStringForResult:inString:offset:template:

于 2013-08-09T22:10:51.260 回答