2012-06-17 23 views
8

Điều này phải là một bản sao. Nhưng với rất nhiều câu hỏi NSPredicate trên mạng, tôi không thể tìm ra câu hỏi đúng.NSPredicate với một chuỗi phù hợp với bắt đầu của các từ

Tôi có danh sách các đối tượng Dữ liệu cốt lõi có chứa trường compositeName. Một cái tên như 'Emily Blunt' có thể ở trong đó. Tôi muốn tìm kiếm danh sách bằng cách sử dụng một số NSPredicate sẽ cho phép tôi tìm kiếm "Em" nhưng cũng cho "Bl" và sau đó có tên này hiển thị trong kết quả tìm nạp.

Điều này phải cực kỳ dễ dàng, nhưng như bạn đoán, tôi không nhìn thấy nó. nỗ lực khác thường của tôi tại một NSPredicate với một biểu thức chính quy như sau:

[NSPredicate predicateWithFormat:@"compositeName MATCHES[cd] '.*(?<=^|\\s)%@.*'", query]; 

suy nghĩ của tôi cho biểu thức chính quy này là:

  • bất kỳ số lượng ký tự trước
  • gian lookbehind tiêu cực hoặc bắt đầu
  • truy vấn
  • bất kỳ số ký tự nào sau

Nhưng nó không hoạt động. Tôi không nhận được bất kỳ kết quả nào. Làm thế nào để sửa lỗi này?

P.S. Nếu có giải pháp NSPredicate không có Biểu thức chính quy phù hợp với mục đích của tôi.

+0

thể trùng lặp của [ "Tổng số các từ" tìm kiếm trong một NSString qua NSPredicate] (http: // stackoverflow. com/questions/8559156/toàn bộ từ-tìm-trong-một-nsstring-qua-nspredicate) – epologee

Trả lời

16

Bạn cần xây dựng toàn bộ chuỗi mẫu regex bên ngoài chuỗi vị ngữ, sau đó chuyển nó tới vị từ.

Ngoài ra, có một cấu trúc regex \b để khớp với ranh giới từ, đó là những gì bạn đang theo dõi.

Vì vậy, hoàn toàn, điều này sẽ cung cấp cho bạn một giải pháp đơn giản cho vấn đề của bạn:

NSString *searchString = @"Em"; 
NSString *regexString = [NSString stringWithFormat:@".*\\b%@.*", searchString]; 

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.compositeName matches[cd] %@", regexString]; 

Nếu văn bản tìm kiếm đầu vào chưa được làm sạch, bạn có thể muốn làm điều đó trước khi bạn vượt qua nó vào động cơ regex .

Một cải tiến khác có thể là chấp nhận các ký tự unicode ở ranh giới từ để cho phép mọi người tìm kiếm 'Ántonio', 'Über' và các chuỗi tương tự khác.

Các dòng mã sau đây sẽ tạo ra một mô hình regex rằng sẽ chăm sóc của cả hai khía cạnh:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString]; 
Các vấn đề liên quan