Вот решение, которое я использую.Это, вероятно, не идеально, но это работает для моих нужд.
Как отметил Виктор Стрибьев, моя проблема в том, что первый и последний символы моего образца - это один и тот же персонаж "Он предложил мне решение, которое янайти излишнее, но это необходимо, потому что в Objective C. нет функции обратного вызова.
В качестве альтернативы, вот как я решил свою проблему (заменив пробелы в строках в кавычках строки поиска):
1) Я добавляю пробел в конце строки "окна поиска"
NSString * searchstring1 = [searchString stringByAppendingString:@" "];
2) Я использую следующее регулярное выражение для замены пробелов (?: (? <= "^"])(? = \ w) | [^ \ S "]) (? = [^"] <em>"\ s )
NSString *pattern = @"(?:(?<=\"^\"])(?=\\w)|[^\\S\"])(?=[^\"]*\"\\s* )"; // (?:(?<="^"])(?=\w)|[^\S"])(?=[^"]*"\s* )
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
NSString *searchstring2 = [regex stringByReplacingMatchesInString:searchstring1 options:0 range:NSMakeRange(0, [searchstring1 length]) withTemplate:@"xxx"];
NSLog(@"modified %@", searchstring2);
3) Я выделяю все токены для поиска (* разделены пробелами)
NSMutableArray *words = (NSMutableArray *)[searchstring2 componentsSeparatedByString:@" "];
4) восстановить пробелы в цитируемых строках и удалить кавычки
NSString *token;
for(token in words)
{
token = [token stringByReplacingOccurrencesOfString:@"xxx" withString:@" "];
token = [token stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSLog(@"token %@\n", token);
}
следующая строка поиска: Билл "погода ясная" классно выдаст следующий вывод
жетон Билл
жетон погода яркая
токен классный
Надеюсь, это поможет другим.