2012-07-22 9 views
23

Tôi có một NSPredicate như thế này:NSPredicate Exact Match với String

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name CONTAINS %@", myString]; 

Nhưng điều đó sẽ trở lại bất cứ điều gì mà chứa chuỗi đó. Ví dụ: Nếu entity.name tôi nơi:

text 
texttwo 
textthree 
randomtext 

myStringtext sau đó tất cả những chuỗi sẽ phù hợp. Tôi muốn nó để nếu myStringtext nó sẽ chỉ trả lại đối tượng đầu tiên có tên text và nếu myStringrandomtext nó sẽ trả về đối tượng thứ tư với tên randomtext. Tôi cũng đang tìm kiếm nó là trường hợp nhạy cảm và rằng nó bỏ qua khoảng trắng

Trả lời

54

này nên làm điều đó:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name LIKE[c] %@", myString]; 

LIKE trận đấu dây với? và * làm ký tự đại diện. Các [c] chỉ ra rằng so sánh nên được phân biệt chữ hoa chữ thường.

Nếu bạn không muốn? và * để được coi là ký tự đại diện, bạn có thể sử dụng == thay vì LIKE:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.name ==[c] %@", myString]; 

Thông tin thêm trong hộp thoại Format NSPredicate Predicate Chuỗi Cú pháp documentation.

+0

Google có bỏ qua khoảng trắng không? – CoreCode

+0

Ahh, xin lỗi tôi đã bỏ lỡ phần đó. Tôi nghĩ rằng đối với khoảng trắng không nhạy cảm, bạn phải sử dụng MATCHES và cung cấp một biểu thức chính quy thay vì một chuỗi đối sánh đơn giản. Câu trả lời của dasblinkenlight thể hiện điều này. –

12

Bạn có thể sử dụng biểu hiện khớp thường xuyên với vị ngữ của bạn, như thế này:

NSString *str = @"test"; 
NSMutableString *arg = [NSMutableString string]; 
[arg appendString:@"\\s*\\b"]; 
[arg appendString:str]; 
[arg appendString:@"\\b\\s*"]; 
NSPredicate *p = [NSPredicate predicateWithFormat:@"SELF matches[c] %@", arg]; 
NSArray *a = [NSArray arrayWithObjects:@" test ", @"test", @"Test", @"TEST", nil]; 
NSArray *b = [a filteredArrayUsingPredicate:p]; 

Các đoạn mã trên xây dựng một biểu thức chính quy phù hợp với chuỗi với khoảng trống không bắt buộc ngay từ đầu và/hoặc ở cuối, với từ mục tiêu được bao quanh bởi dấu "ranh giới từ" \b. [c] sau matches có nghĩa là "khớp với chữ hoa chữ thường".

Ví dụ này sử dụng một chuỗi các chuỗi; để làm cho nó hoạt động trong môi trường của bạn, hãy thay thế SELF bằng entity.name.