2012-04-10 2 views
7

NSPredicate를 사용하여 대소 문자를 구분하지 않고 분음 부호를 구분하지 않는 과 공백을 구분하지 않는의 두 문자열을 일치시켜야합니다.공백을 무시하는 NSPredicate

술어는 다음과 같이 보일 것입니다 :

[NSPredicate predicateWithFormat:@"Key ==[cdw] %@", userInputKey]; 

'w'수정 내가 사용하고 싶은 것을 표현하는 발명이다.

데이터 소스 "키"값에도 공백이있을 수 있으므로 (단지 공백이 필요하며 미리 트리밍 할 수는 없기 때문에) 나는 userInputKey을자를 수 없습니다.

예를 들어, 주어진 userInputKey "abc"조건자는 모두

{"abc", "a b c", " a B C "}
과 일치해야합니다. userInputKey "a B C"가 주어지면 술어는 위 집합의 모든 값과 일치해야합니다.

이렇게 어렵지는 않습니까?

답변

11

이 같은 정의에 대해 어떻게이처럼 사용 다음

+ (NSPredicate *)myPredicateWithKey:(NSString *)userInputKey { 
    return [NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedString, NSDictionary *bindings) { 
     // remove all whitespace from both strings 
     NSString *strippedString=[[evaluatedString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""]; 
     NSString *strippedKey=[[userInputKey componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""]; 
     return [strippedString caseInsensitiveCompare:strippedKey]==NSOrderedSame; 
    }]; 
} 

을 :

NSArray *testArray=[NSArray arrayWithObjects:@"abc", @"a bc", @"A B C", @"AB", @"a B d", @"A  bC", nil]; 
NSArray *filteredArray=[testArray filteredArrayUsingPredicate:[MyClass myPredicateWithKey:@"a B C"]];    
NSLog(@"filteredArray: %@", filteredArray); 

결과는 다음과 같습니다 // 유래 :

2012-04-10 13:32:11.978 Untitled 2[49613:707] filteredArray: (
    abc, 
    "a bc", 
    "A B C", 
    "A  bC" 
) 
+0

나는 HTTP를 조회했다 .com/questions/3543208/nsfetchrequest-and-predicatewithblock 왜냐하면 NSFetchRequest와 함께 술어를 사용하고 싶었으므로, n은 아름답게 일했다. 감사! – JiaYow

관련 문제