В иврите есть определенные гласные, которые NSPredicate не может игнорировать даже при использовании модификатора 'd' (нечувствительность к диакритическим знакам) в предикате. Мне сказали, что решение - использовать регулярные выражения для поиска.
Как мне взять строку поиска и «использовать регулярное выражение» для поиска текста на иврите, содержащего гласные, игнорируя эти гласные?
Изменить:
Другими словами, если бы я хотел выполнить поиск в следующем тексте, игнорируя тире и звездочки, как мне это сделать с помощью регулярного выражения?
Пример текста:
Я пришла в последний день.
Редактировать 2:
По сути, я хочу:
Редактировать 3:
Вот как я реализую свой поиск:
//
// The user updated the search text
//
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString{
NSMutableArray *unfilteredResults = [[[[self.fetchedResultsController sections] objectAtIndex:0] objects] mutableCopy];
if (self.filteredArray == nil) {
self.filteredArray = [[[NSMutableArray alloc ] init] autorelease];
}
[filteredArray removeAllObjects];
NSPredicate *predicate;
if (controller.searchBar.selectedScopeButtonIndex == 0) {
predicate = [NSPredicate predicateWithFormat:@"articleTitle CONTAINS[cd] %@", searchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 1) {
predicate = [NSPredicate predicateWithFormat:@"articleContent CONTAINS[cd] %@", searchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 2){
predicate = [NSPredicate predicateWithFormat:@"ANY tags.tagText CONTAINS[cd] %@", searchString];
}else{
predicate = [NSPredicate predicateWithFormat:@"(ANY tags.tagText CONTAINS[cd] %@) OR (dvarTorahTitle CONTAINS[cd] %@) OR (dvarTorahContent CONTAINS[cd] %@)", searchString,searchString,searchString];
}
for (Article *article in unfilteredResults) {
if ([predicate evaluateWithObject:article]) {
[self.filteredArray addObject:article];
}
}
[unfilteredResults release];
return YES;
}
Редактировать 4:
Мне не нужно использовать для этого регулярное выражение, мне просто посоветовали это сделать. Если у вас есть другой способ, который работает, дерзайте!
Редактировать 5:
Я изменил свой поиск, чтобы он выглядел следующим образом:
NSInteger length = [searchString length];
NSString *vowelsAsRegex = @"[\\u5B0-\\u55C4]*";
NSMutableString *modifiedSearchString = [searchString mutableCopy];
for (int i = length; i > 0; i--) {
[modifiedSearchString insertString:vowelsAsRegex atIndex:i];
}
if (controller.searchBar.selectedScopeButtonIndex == 0) {
predicate = [NSPredicate predicateWithFormat:@"articleTitle CONTAINS[cd] %@", modifiedSearchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 1) {
predicate = [NSPredicate predicateWithFormat:@"articleContent CONTAINS[cd] %@", modifiedSearchString];
}else if (controller.searchBar.selectedScopeButtonIndex == 2){
predicate = [NSPredicate predicateWithFormat:@"ANY tags.tagText CONTAINS[cd] %@", modifiedSearchString];
}else{
predicate = [NSPredicate predicateWithFormat:@"(ANY tags.tagText CONTAINS[cd] %@) OR (dvarTorahTitle CONTAINS[cd] %@) OR (dvarTorahContent CONTAINS[cd] %@)", modifiedSearchString,modifiedSearchString,modifiedSearchString];
}
for (Article *article in unfilteredResults) {
if ([predicate evaluateWithObject:article]) {
[self.filteredArray addObject:article];
}
}
Мне все еще что-то не хватает, что мне нужно сделать, чтобы это сработало?
Редактировать 6:
] Хорошо, почти готово. Мне нужно сделать еще два изменения, чтобы с этим покончить.
Мне нужно иметь возможность добавлять в регулярное выражение другие диапазоны символов, которые могут отображаться вместо или в дополнение к символу в другом наборе. Я попытался изменить первый диапазон на этот:
[\u05b0-\u05c, \u0591-\u05AF]?
Что-то мне подсказывает, что это неверно.
Кроме того, мне нужно, чтобы остальная часть регулярного выражения была нечувствительной к регистру. Какой модификатор мне нужно использовать с регулярным выражением . *
, чтобы сделать его нечувствительным к регистру?