iPhone «Целое слово» Поиск - PullRequest
1 голос
/ 16 июля 2009

В настоящее время я использую следующий алгоритм для поиска в приложении для iPhone:

NSRange range = [entry.englishEntry rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if(range.location != NSNotFound)
        {
            [self.filteredListContent addObject:entry];
        }

Проблема в том, что когда я ищу слово типа «дерьмо», я также получаю результаты для слов типа «лом», которые не имеют значения. Я не знаком с NSRange, так каков алгоритм поиска для поиска по всему слову?

Ответы [ 4 ]

3 голосов
/ 23 сентября 2009

Я только что решил эту проблему, добавив простую категорию на NSString для поиска границ слов. Вот код:

@interface NSString (FullWordSearch)

// Search for a complete word. Does not match substrings of words. Requires fullWord be present
// and no surrounding alphanumeric characters.
- (BOOL)containsFullWord:(NSString *)fullWord;

@end

@implementation NSString (FullWordSearch)

- (BOOL)containsFullWord:(NSString *)fullWord {
    NSRange result = [self rangeOfString:fullWord];
    if (result.length > 0) {
        if (result.location > 0 && [[NSCharacterSet alphanumericCharacterSet] characterIsMember:[self characterAtIndex:result.location - 1]]) {
            // Preceding character is alphanumeric
            return NO;
        }
        if (result.location + result.length < [self length] && [[NSCharacterSet alphanumericCharacterSet] characterIsMember:[self characterAtIndex:result.location + result.length]]) {
            // Trailing character is alphanumeric
            return NO;
        }
        return YES;
    }
    return NO;
}

@end
2 голосов
/ 25 октября 2009

Да, вы можете искать по словам. Вам нужно сначала разбить строку на компоненты. Затем переберите каждый из них и сравните их.

Примерно так:

  NSArray *words = [entry.english componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
  for (NSString *word in words)
  { 
      NSComparisonResult result = [word compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
      if (result == NSOrderedSame)
      {
        [self.filteredListContent addObject:entry];
        break;
      }
  }
0 голосов
/ 15 марта 2012

Теперь я делаю его более общим, используя этот код, вы можете искать любую строку между целевой строкой

    NSString * strName =[entry.english lowercaseString];

    if ([strName rangeOfString:[searchText lowercaseString]].location != NSNotFound) {
         [self.filteredListContent addObject:entry];}
0 голосов
/ 16 июля 2009

Вместо того, чтобы найти диапазон строки, просто выполните сравнение без учета регистра и проверьте, является ли результат NSOrderedSame

if([entry.english caseInsensitiveCompare:searchText] == NSOrderedSame){
  [self.filteredListContent addObject:entry];
}

Это позволит сравнить текст со всем словом, а не просто искать диапазон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...