stringByReplacingMatchesInString:returns(null)

时间:2011-06-27 13:09:25

标签: iphone objective-c regex ios4 nsregularexpression

这是我的代码:

NSRegularExpression * regex;

- (void)viewDidLoad {
    NSError *error = NULL;
    regex = [NSRegularExpression regularExpressionWithPattern:@"<*>" options:NSRegularExpressionCaseInsensitive error:&error];
}

- (IBAction)findWord {  
    NSString * fileContents=[NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@/report1_index1_page1.html", [[NSBundle mainBundle] resourcePath]]];
    NSLog(@"%@",fileContents);

    NSString * modifiedString = [regex stringByReplacingMatchesInString:fileContents
                                                                options:0
                                                                  range:NSMakeRange(0, [fileContents length])
                                                           withTemplate:@"$1"];

    NSLog(@"%@",modifiedString);
}

我的'modifiedString'正在返回(null)。为什么?我想替换'&lt;'之间的任何字符和'&gt;'包括'&lt;'和'&gt;'只是一个空间。

1 个答案:

答案 0 :(得分:3)

我猜这与您在regex中为viewDidLoad分配自动释放的对象这一事实有很大关系。尝试添加retain或将该行移至findWord方法。

正则表达式

用于匹配<>之间所有内容的正则表达式不正确。正确的方法是,

NSError *error = nil;
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=<).*(?=>)" options:NSRegularExpressionCaseInsensitive error:&error];
if ( error ) {
    NSLog(@"%@", error);
}

以空格替换

如果要将匹配的字符串替换为" ",则不应将$1作为模板传递。而是使用" "作为模板。

NSString * modifiedString = [regex stringByReplacingMatchesInString:fileContents
                                                            options:0
                                                              range:NSMakeRange(0, [fileContents length])
                                                       withTemplate:@" "];