"Целое слово" поиск в строке NSS через NSPredicate - PullRequest
4 голосов
/ 19 декабря 2011

Я бы хотел найти, если в атрибуте description (экземпляр NSString) есть данное слово.

Я пробовал с этим предикатом:

[NSPredicate predicateWithFormat:@"description CONTAINS[cd] %@", theWord];

Работает, но также находит подслов .

Например, учитывая theWord:

Car

это будет также это description:

Рождественская колядка

Вместо этого я хотел бы, чтобы мой предикат совпадал только с a, или christmas, или carol.

(я использую Core Data и NSFetchRequest.)

1 Ответ

14 голосов
/ 19 декабря 2011

Как то так?

NSString *matchStr = @".*\\bCarol\\b.*";

NSPredicate *pred =[NSPredicate predicateWithFormat: @"description MATCHES %@", matchStr];

NSArray *arr = @[ 
    @"A Christmas Carol",
    @"Sing",
    @"Song"
];

NSArray *filtered = [arr filteredArrayUsingPredicate: pred];

Уловка - метасимвол \b, который обозначает границу слова в строке. Чтобы получить обратную косую черту «в» строке шаблона регулярного выражения, вам нужно добавить к ней другую обратную косую черту, чтобы компилятор понимал, что в строке должен быть настоящий обратный слеш. Отсюда "\\ b" в строке.

Кроме того, чтобы лучше охватить строки, не относящиеся к английскому языку, вы должны включить обнаружение границы слов в Юникоде, установив параметр флага w. Строка совпадения будет выглядеть так:

NSString *matchStr = @"(?w).*\\bCarol\\b.*"; 
...