iOS: как удалить недопустимые символы из строки поиска, одновременно разрешив поиск по нескольким словам - PullRequest
1 голос
/ 13 февраля 2012

Это дополнительный вопрос к этому ..

Благодаря Нику Локвуду я могу использовать этот код для фильтрации плохих символов:

NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];

Однако у меня есть строки типа «Я, ты» или «Это не тот».

Я бы хотел найти "Вы" или "тот".

Вышеприведенный код, кажется, слишком сильно меня ограничивает, и я могу искать слова только до специального символа.

Могу ли я получить дополнительную помощь, пожалуйста?

UPDATE:

Я пытался использовать этот код:

NSString *badChars = @"\\\'";
NSCharacterSet *badCharSet = [NSCharacterSet characterSetWithCharactersInString: badChars];
NSString *safeSearchString = [sbar.text stringByTrimmingCharactersInSet:badCharSet];

но не радость .. Пожалуйста, прости все вопросы новичка ...

ВТОРОЕ ОБНОВЛЕНИЕ:

Я тоже пробовал этот код. Это метод делегата:

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ((text == @"\\") || (text == @"\'")) {
        return NO;      
    } else {
        return YES;
    }
}

Это почти работает, но не выдерживает проверку предикатом: "Невозможно разобрать строку формата" 'not' ИЛИ ​​данные содержат [cd] 'not' "'...

1 Ответ

6 голосов
/ 13 февраля 2012

Я не уверен, что вы понимаете, что делает код в вашем примере.Этот код выполняет следующие действия:

  1. создает набор всех буквенно-цифровых символов
  2. создает инверсию этого набора (т. Е. Все не алфавитно-цифровые символы)
  3. разбивает вашисходная строка в массив подстрок, разделенных любыми символами в не алфавитно-цифровом наборе символов
  4. собрать подстроки в этом массиве обратно в одну строку как ваш конечный результат

Окончательныйрезультат - ваша исходная строка за вычетом любых не буквенно-цифровых символов.Так что, если ваша оригинальная searchString была такой:

This isn't the one

Тогда ваша safeSearchString будет:

Thisisnttheone

Я думаю, что это, вероятно, не то, что вы хотите.Я не знаю точно, что вы делаете, но я могу дать несколько идей, которые могут помочь:

Если вы хотите удалить НЕКОТОРЫЕ запрещенные символы из вашей строки вместо всех не алфавитно-цифровых, выможет создать пользовательский набор символов следующим образом:

// remove only apostrophe and dollar sign characters
NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:@"'$"];
NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];

Если вы хотите удалить все не алфавитно-цифровые символы, но оставить пробелы:

// remove any characters except alphanumeric and space
NSMutableCharacterSet *charSet = [NSMutableCharacterSet characterSetWithCharactersInString@" "];
[charset formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];

Вы также можете удалить небуквенно-цифровые / непробельные символы, а затем разделяются на массив отдельных слов:

NSString * searchString = @"This isn't the one";  // example

// remove any characters except alphanumeric and space and break into an array on word boundaries
NSMutableCharacterSet *charSet = [NSMutableCharacterSet characterSetWithCharactersInString@" "];
[charset formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
NSString *safeSearchString = [[searchString componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
NSArray *safeSearchWords = [safeSearchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSString *word;
for (word in safeSearchWords) {
    NSLog(@"%@",word);
}

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