Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSPredicate用于筛选具有(';)字符问题的数组_Ios_Objective C_Nspredicate - Fatal编程技术网

Ios NSPredicate用于筛选具有(';)字符问题的数组

Ios NSPredicate用于筛选具有(';)字符问题的数组,ios,objective-c,nspredicate,Ios,Objective C,Nspredicate,下面是我用字符串过滤数组的测试。如果我的字符串不包含(')字符,它就可以正常工作 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil]; //NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"];

下面是我用字符串过滤数组的测试。如果我的字符串不包含(')字符,它就可以正常工作

    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 contains[c]“b”“”

如何解决?任何帮助都将不胜感激。

试试这个

NSString *searchword = @"b";
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchword];
你得到的是

试试这个

NSString *searchword = @"b";
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchword];
你得到的是


请尝试按如下方式筛选结果:

    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);

请尝试按以下方式筛选结果:

    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);

当你尝试反斜杠时,你已经很接近了。这是
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编译器。它处理代码中的所有字符串文本,并替换遇到的转义序列。如果希望看到单个反斜杠,字符串文字需要有两个反斜杠,因为反斜杠本身在Objective-C字符串文字中编码为
\\

尝试反斜杠时,您的距离非常近。这是
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编译器。它处理代码中的所有字符串文本,并替换遇到的转义序列。如果希望看到单个反斜杠,字符串文字需要有两个反斜杠,因为反斜杠本身在Objective-C字符串文字中编码为
\\

如果您的名字是b'en

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

希望这会有所帮助:)

如果你的名字是b'en

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

希望这会有所帮助:)

可能不相关,但是
包含
对于一个谓词来说听起来像是一个不好的候选者,其结果被命名为
beginWith…
@Alladinian是的,这只是我的测试,我只是从中复制了这段代码。感谢您的更正可能与此无关,但是
contains
对于一个结果名为
beginWith…
@Alladinian是的,这只是我的测试,我只是从中复制了这段代码。感谢您的更正如果您想要excat答案,请使用daskblinkknight答案,否则请尝试我的答案您提供了正确的解决方案,但您向我展示的方式不是很好。因为我询问的字符串是('),但在测试中,字符串不包含(')。无论如何,非常感谢您给我一个正确的解决方案;)如果你想得到excat答案,请使用daskblinkknight答案,否则请尝试我的答案。你提供了正确的解决方案,但你给我的方式不是很好。因为我询问的字符串是('),但在测试中,字符串不包含(')。无论如何,非常感谢您给我一个正确的解决方案;)@PhanVănLinh Welcome:-)@PhanVănLinh Welcome:-)它因错误而崩溃:
此类不符合密钥名称的键值编码。
。我找到了解决办法。感谢您的帮助IT崩溃并出现以下错误:
此类不符合密钥名称的键值编码。
。我找到了解决办法。谢谢你的帮助