我想要 NSRegularExpression 的变体– stringByReplacingMatchesInString:options:range:withTemplate:
使用块而不是模板的方法。该块的返回值将用作替换值。正如您可以想象的那样,这比模板更灵活。有点像使用/e
Perl 正则表达式中的修饰符。
所以我写了一个类别来添加方法。这就是我想出的:
@implementation NSRegularExpression (Block)
- (NSString *)stringByReplacingMatchesInString:(NSString *)string
options:(NSMatchingOptions)options
range:(NSRange)range
usingBlock:(NSString* (^)(NSTextCheckingResult *result))block
{
NSMutableString *ret = [NSMutableString string];
NSUInteger pos = 0;
for (NSTextCheckingResult *res in [self matchesInString:string options:options range:range]) {
if (res.range.location > pos) {
[ret appendString:[string substringWithRange:NSMakeRange(pos, res.range.location - pos)]];
}
pos = res.range.location + res.range.length;
[ret appendString:block(res)];
}
if (string.length > pos) {
[ret appendString:[string substringFromIndex:pos]];
}
return ret;
}
@end
这是我第一次尝试在 Objective C 中使用块。感觉有点奇怪,但似乎效果很好。不过,我对此有几个问题:
- 这看起来是实现这种方法的明智方法吗?
- 有什么方法可以使用它来实现其内部结构
-enumerateMatchesInString:options:range:usingBlock:
?我尝试了,但无法分配给pos
从块内。但如果有一种方法可以让它工作,那么传递 NSMatchingFlags 和 BOOL 并以与该方法相同的方式处理它们会很酷。可行吗?
Update
感谢 Dave DeLong 的回答,我得到了一个使用块的新版本:
@implementation NSRegularExpression (Block)
- (NSString *)stringByReplacingMatchesInString:(NSString *)string
options:(NSMatchingOptions)options
range:(NSRange)range
usingBlock:(NSString * (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block
{
NSMutableString *ret = [NSMutableString string];
__block NSUInteger pos = 0;
[self enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop)
{
if (match.range.location > pos) {
[ret appendString:[string substringWithRange:NSMakeRange(pos, match.range.location - pos)]];
}
pos = match.range.location + match.range.length;
[ret appendString:block(match, flags, stop)];
}];
if (string.length > pos) {
[ret appendString:[string substringFromIndex:pos]];
}
return [NSString stringWithString:ret];
}
@end
效果很好,谢谢!
能够分配给pos
从块内更改声明就像更改声明一样简单:
NSUInteger pos = 0;
To:
__block NSUInteger pos = 0;
更多信息关于__block
关键词:__block变量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)