2012-06-17 4 views
8

Это должно быть дубликат. Но с таким количеством вопросов NSPredicate я не могу найти правильный.NSPredicate со строкой, соответствующей началу слов

У меня есть список объектов Core Data, которые содержат поле compositeName. Там может быть такое имя, как «Эмили Блант». Я хочу найти список, используя NSPredicate, который позволит мне искать «Em», но также и для «Bl», а затем отобразить это имя в полученных результатах.

Это должно быть очень просто, но, как вы думаете, я не вижу его. Моя дисфункциональной попытка на NSPredicate с регулярным выражением выглядит следующим образом:

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

Моя мысль для этого регулярного выражения были:

  • любое количество символов, прежде чем
  • негативных просмотром назад пространств или начало
  • запрос
  • любое количество символов после

Но это не работает. Я не получаю никаких результатов. Как это исправить?

P.S. Если есть решение NSPredicate без регулярных выражений, которое бы соответствовало моей цели.

+0

возможный дубликат [ «Всего слово» поиск в NSString через NSPredicate] (Http: // StackOverflow. ком/вопросы/8559156/всего слово-поиск-в-NSString-через-NSPredicate) – epologee

ответ

16

Вам нужно построить целую строку шаблона регулярного выражения вне строки предиката, а затем передать ее предикату.

Также существует конструкция регулярного выражения \b, чтобы соответствовать границе слова, что является тем, что вы после.

Так в целом, это должно дать вам простое решение вашей проблемы:

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

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

Если входной текстовый поиск не был очищен, вы можете сделать это, прежде чем передать его на движок регулярных выражений ,

Другим усовершенствованием может быть принятие символов Юникода на границе слова, чтобы люди могли искать «Ántonio», «Über» и другие подобные строки.

следующие строки кода создаст регулярное выражение шаблон, который будет заботиться о двух аспектах:

NSString *orgSearchString = @"^"; 

NSString *escapedSearchString = [NSRegularExpression escapedPatternForString: orgSearchString]; 

NSString *regexString = [NSString stringWithFormat:@"(?w:).*\\b%@.*", escapedSearchString]; 
Смежные вопросы