2013-02-26 38 views
9

Làm cách nào để tạo một NSPredicate tìm kiếm các cụm từ tìm kiếm ở bất kỳ đâu trong một đối tượng mảng? Tôi không thể giải thích nó đúng cách, vì vậy đây là một ví dụ.NSPredicate khớp với bất kỳ ký tự nào

NSArray *array = @[@"Test String: Apple", @"Test String: Pineapple", @"Test String: Banana"]; 
NSString *searchText = @"Apple"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText]; 
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"filteredArray: %@", filteredArray); 

// filteredArray: (
// "Test String: Apple", 
// "Test String: Pineapple" 
//) 

Nhưng nếu tôi sử dụng NSString *searchText = @"Test Str Appl"; Tôi nhận được kết quả bằng không. Tôi muốn nó phù hợp với kết quả tương tự cho chuỗi này.

Điều tôi đang tìm kiếm là chức năng tìm kiếm tương tự với menu "Mở nhanh" trong Xcode, trong đó chuỗi tìm kiếm của bạn được viết đúng không quan trọng, chỉ các chữ cái theo đúng thứ tự như một trận đấu. Tôi thực sự hy vọng rằng có ý nghĩa.

Open Quickly Menu

+1

Rõ ràng, thuật ngữ tôi đang tìm kiếm là "Kết hợp mờ". – squarefrog

Trả lời

19

Các LIKE chuỗi so sánh trong các vị từ cho phép ký tự đại diện *?, nơi * trận 0 hoặc nhiều ký tự. Do đó, nếu bạn chuyển đổi văn bản tìm kiếm của bạn vào

NSString *searchWithWildcards = @"*T*e*s*t* *S*t*r*A*p*p*l*"; 

bằng cách chèn một * ở phần đầu, giữa tất cả các nhân vật, và vào cuối của văn bản tìm kiếm ban đầu bằng cách sử dụng một cái gì đó như thế này

NSMutableString *searchWithWildcards = [NSMutableString stringWithFormat:@"*%@*", self.searchField.text]; 
if (searchWithWildcards.length > 3) 
    for (int i = 2; i < self.searchField.text.length * 2; i += 2) 
     [searchWithWildcards insertString:@"*" atIndex:i]; 

sau đó bạn có thể sử dụng

[NSPredicate predicateWithFormat:@"SELF LIKE[cd] %@", searchWithWildcards]; 

Tìm kiếm vị ngữ cho các ký tự theo thứ tự nhất định, với các ký tự tùy ý khác giữa chúng.


Việc chuyển đổi có thể cho ví dụ được thực hiện với đoạn mã sau:

NSMutableString *searchWithWildcards = [@"*" mutableCopy]; 
[searchText enumerateSubstringsInRange:NSMakeRange(0, [searchText length]) 
        options:NSStringEnumerationByComposedCharacterSequences 
       usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
        [searchWithWildcards appendString:substring]; 
        [searchWithWildcards appendString:@"*"]; 
       }]; 
+0

Đây chính xác là những gì tôi đang tìm kiếm. Một giải pháp rất thanh lịch. Cảm ơn bạn. – squarefrog

+0

@squarefrog: Bạn được hoan nghênh. –

Các vấn đề liên quan