2012-06-17 6 views
8

Questo deve essere un duplicato. Ma con così tante domande su NSPredicate, non riesco a trovare quella giusta.NSPredicate con una stringa corrispondente all'inizio delle parole

Ho un elenco di oggetti Dati principali che contengono un campo compositeName. Un nome come "Emily Blunt" potrebbe essere lì dentro. Voglio cercare l'elenco utilizzando un NSPredicate che mi consenta di cercare "Em" ma anche per "Bl" e quindi visualizzare questo nome nei risultati recuperati.

Questo deve essere super facile, ma come si può immaginare, non lo vedo. Il mio tentativo disfunzionali ad un NSPredicate con un'espressione regolare è simile al seguente:

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

Il mio pensiero per questa espressione regolare sono stati:

  • qualsiasi numero di caratteri prima
  • spazi lookbehind negativi o inizio
  • la query
  • qualsiasi numero di caratteri dopo

Ma non funziona. Non ho risultati. Come posso risolvere questo?

P.S. Se c'è una soluzione di NSPredicate senza le espressioni regolari che si adatterebbe anche al mio scopo.

+0

possibile duplicato [ "Parola intera" Cerca in una NSString attraverso NSPredicate] (http: // StackOverflow. com/domande/8559156/whole-word-search-in-a-NSString-through-nspredicate) – epologee

risposta

16

È necessario creare l'intera stringa del modello regex all'esterno della stringa del predicato, quindi passarla al predicato.

Inoltre, esiste un costrutto regex \b corrispondente a un limite di parola, che è quello che si sta cercando.

Quindi del tutto, questo dovrebbe dare una soluzione semplice al problema:

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

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

Se il testo di ricerca ingresso non è stato pulito, si potrebbe desiderare di fare prima di passarlo al motore regex .

Un altro miglioramento potrebbe essere quello di accettare caratteri unicode al limite della parola per consentire alle persone di cercare "Ántonio", "Über" e altre stringhe simili.

Le seguenti righe di codice creerà un modello di espressione regolare che si prenderà cura di entrambi gli aspetti:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

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