Как использовать регулярное выражение для поиска, игнорируя определенные символы с помощью NSPredicate?

В иврите есть определенные гласные, которые NSPredicate не может игнорировать даже при использовании модификатора 'd' (нечувствительность к диакритическим знакам) в предикате. Мне сказали, что решение - использовать регулярные выражения для поиска.

Как мне взять строку поиска и «использовать регулярное выражение» для поиска текста на иврите, содержащего гласные, игнорируя эти гласные?

Изменить:

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

Пример текста:

Я пришла в последний день.

Редактировать 2:

По сути, я хочу:

  1. Взять строку ввода от пользователя
  2. Взять строку для поиска
  3. Использовать регулярное выражение на основе строки поиска пользователя для поиска "содержит "соответствует большему блоку текста. Регулярное выражение должно игнорировать гласные, как показано выше.

Редактировать 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]?

Что-то мне подсказывает, что это неверно.

Кроме того, мне нужно, чтобы остальная часть регулярного выражения была нечувствительной к регистру. Какой модификатор мне нужно использовать с регулярным выражением . * , чтобы сделать его нечувствительным к регистру?

11
задан Moshe 23 November 2011 в 01:40
поделиться