NSPredicate用于过滤带有(')字符问题的数组

时间:2016-05-19 10:42:48

标签: ios objective-c nspredicate

这是我用字符串过滤数组的测试。如果我的字符串不包含(')字符

,它会很好用
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil];

    //NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"]; -> it work
    NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b''"]; -> it crash
    NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
    NSLog(@"beginwithB = %@",beginWithB);

我也尝试将我的字符串更改为'b\'''b''',但它仍会崩溃

这是崩溃日志

  

由于未捕获的异常终止应用' NSInvalidArgumentException',原因:'无法解析格式字符串" SELF包含[c]' b'&#39 ;'"'

如何解决?任何帮助都将非常感激。

4 个答案:

答案 0 :(得分:2)

试试这个

NSString *searchword = @"b";
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchword];

你得到

的输出

enter image description here

答案 1 :(得分:2)

请尝试按如下方式过滤结果:

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil];
        NSString *strToBeSearched = @"b'";

        //NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"]; -> it work

        NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",strToBeSearched]; //-> it also work

        //OR

        NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b\\''"];


        NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
        NSLog(@"containB = %@",beginWithB);

答案 2 :(得分:1)

当你尝试反斜杠时,你非常接近。这是NSPredicate用于转义特殊字符的字符。但是,您需要两个而不是一个反斜杠:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil];
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b\\''"];
//                                                                              ^^
NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
NSLog(@"beginwithB = %@",beginWithB);

你需要两个的原因是Objective-C编译器。它处理代码中的所有字符串文字,并替换它遇到的转义序列。如果你希望NSPredicate看到一个反斜杠,你的字符串文字需要有两个反斜杠,因为反斜杠本身在Objective-C字符串文字中被编码为\\

答案 3 :(得分:0)

如果你的名字是,那么,

 NSString *name = @"b'en";
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == \"%@\"", name];

希望这会有所帮助:)