2012-06-17 13 views
8

übereinstimmt Dies muss ein Duplikat sein. Aber bei so vielen NSPredicate-Fragen kann ich nicht die richtige finden.NSPredicate mit einer Zeichenkette, die Anfang der Wörter

Ich habe eine Liste der Core Data Objekte, die ein compositeName Feld enthalten. Ein Name wie "Emily Blunt" könnte da drin sein. Ich möchte die Liste mit einer NSPredicate suchen, die mich nach "Em" aber auch nach "Bl" suchen lassen und dann diesen Namen in den abgerufenen Ergebnissen anzeigen lassen kann.

Das muss super einfach sein, aber wie Sie vermuten, sehe ich es nicht. Mein dysfunktionalen Versuch einer NSPredicate mit einem regulären Ausdruck sieht wie folgt aus:

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

Mein Gedanke für diesen regulären Ausdruck waren:

  • eine beliebige Anzahl von Zeichen vor
  • negativen Lookbehind Leerzeichen oder Anfang
  • die Abfrage
  • beliebig viele Zeichen nach

Aber es funktioniert nicht. Ich bekomme keine Ergebnisse. Wie behebe ich das?

P.S. Wenn es eine NSPredicate-Lösung ohne reguläre Ausdrücke gibt, die auch meinem Zweck entspricht.

+0

möglich Duplikat [ „Ganzes Wort“ Suche in einem NSString durch NSPredicate] (http: // Stackoverflow. com/questions/8559156/word-search-in-a-nsstring-durch-nspredicate) – epologee

Antwort

16

Sie müssen die gesamte Regex-Musterzeichenfolge außerhalb der Prädikatzeichenfolge erstellen und dann an das Prädikat übergeben.

Außerdem gibt es ein Regex-Konstrukt \b um eine Wortgrenze zu entsprechen, die Sie suchen.

Also insgesamt, sollte dies Ihnen eine einfache Lösung für Ihr Problem:

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

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

Wenn die Eingabe Suchtext nicht gereinigt wurde, könnten Sie tun wollen, bevor Sie es weitergeben an die Regex-Engine .

Eine weitere Verbesserung könnte darin bestehen, Unicode-Zeichen an der Wortgrenze zu akzeptieren, um es Leuten zu ermöglichen, nach 'Ántonio', 'Über' und anderen ähnlichen Strings zu suchen.

Die folgenden Codezeilen einen RegexMuster erstellen, die Pflege beiden Aspekte nehmen:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

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