2012-06-17 16 views
8

To musi być duplikat. Ale z tak wieloma pytaniami NSPredicate, nie mogę znaleźć właściwego.NSPredicate z ciągiem pasującym do początku słów

Mam listę obiektów Core Data, które zawierają pole compositeName. Może być tam imię takie jak "Emily Blunt". Chcę przeszukać listę, używając NSPredicate, która pozwoli mi wyszukać "Em", ale także "Bl", a następnie mieć tę nazwę w pobranych wynikach.

To musi być bardzo łatwe, ale jak można się domyślić, nie widzę tego. Mój dysfunkcyjnych próba na NSPredicate z wyrażenia regularnego wygląda następująco:

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

moja myśl tego wyrażenia regularnego były:

  • dowolną ilość znaków przed
  • negatywnych przestrzeni lookbehind lub rozpoczynających
  • zapytanie
  • dowolna liczba znaków po

Ale to nie działa. Nie osiągam żadnych wyników. Jak to naprawić?

P.S. Jeśli istnieje rozwiązanie NSPredicate bez wyrażeń regularnych, które pasowałoby również do mojego celu.

+0

możliwy duplikat [ „całe słowo” szukać w NSString przez NSPredicate] (http: // stackoverflow. com/questions/8559156/whole-word-search-in-a-nsstring-through-nspredicate) – epologee

Odpowiedz

16

Musisz zbudować cały łańcuch wzorca regex poza łańcuchem predykatów, a następnie przekazać go do predykatu.

Ponadto istnieje konstrukcja regex \b, która pasuje do granicy słowa, której właśnie szukasz.

Więc w sumie powinno to daje proste rozwiązanie problemu:

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

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

Jeśli tekst wyszukiwania wejściowy nie został oczyszczony, może chcesz zrobić, zanim go przekazywać silnika regex .

Kolejnym ulepszeniem może być akceptowanie znaków Unicode na granicy wyrazów, aby umożliwić użytkownikom wyszukiwanie "Ántonio", "Über" i innych podobnych ciągów.

następujące linie kodu stworzy regex wzór, który zadba o obu aspektach:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString];