В Objective C, каков наилучший способ извлечь несколько подстрок текста вокруг нескольких шаблонов? - PullRequest
0 голосов
/ 13 марта 2010

Для одной строки NSSt у меня есть N строк шаблонов. Я хотел бы извлечь подстроки "вокруг" шаблонных совпадений.

Итак, если у меня есть «быстрая коричневая лиса, перепрыгнувшая через ленивую собаку» и мои рисунки «коричневые» и «ленивые», я бы хотел получить «быструю коричневую лису» и «ленивую собаку». Однако подстроки не обязательно должны быть разделены пробелами.

Еще один пример: если у вас есть несколько абзацев текста, и вы хотите найти все экземпляры «красный» и «синий» в тексте, но вы хотите показать экземпляры «красный» и «синий» в контексте, но по «контексту» вам было все равно, если контекст начинается и заканчивается словами или окончаниями слов в основной части текста, поэтому, если у вас есть одно из предложений в основной части текста как «есть много красные утки на деревьях "результатом может быть" много красных уток "или" много красных уток ", и это не имеет значения - я не ищу решение на основе пробелов. это может быть просто найти «красный» и получить подстроку «красный» и 10 символов до и 10 символов после.

Другими словами, есть некоторые функции сравнения строк на основе диапазона. Я надеялся, что есть простой способ сопоставить несколько строк одновременно и вернуть точку сопоставления каждой строки плюс окружающие символы.

Ответы [ 2 ]

6 голосов
/ 13 марта 2010

Я думаю, что вы хотите NSScanner. Чтобы найти произвольную строку в большей строке, вы делаете что-то вроде:

 NSString *scannedString = nil;
 NSScanner *scanner = [NSScanner scannerWithString:@"The quick brown fox jumped over the lazy dog"];
 [scanner scanUpToString:@"brown" intoString:&scannedString];
 // scannedString is now @"The quick " and the scanner's location is right before "brown"

Чтобы получить контекст, вам нужно решить, сколько вокруг места, где было найдено «коричневое», вы хотите включить в свой результат.

В качестве альтернативного решения, когда вы всегда ищете слова, вы можете использовать componentsSeparatedByString: NSString, чтобы получить массив, а затем вернуть элемент + x много элементов вокруг него. Например:

 NSArray *words = [@"The quick brown fox jumped over the lazy dog" componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet];
 NSUInteger wordLocation = [words indexOfObject:@"brown"];
 NSString *wordInContext = [[words subarrayWithRange:NSMakeRange(brownlocation-2, brownLocation+2)] componentsJoinedByString:@" "];

(Во всех примерах здесь отсутствует необходимая проверка ошибок, но это просто для того, чтобы дать вам представление о том, как вы можете делать такие вещи.)

3 голосов
/ 13 марта 2010

Вы можете использовать регулярные выражения, предоставляемые сторонней платформой (например, RegexKit или RegexKitLite ). Чтобы создать RE, соедините шаблоны с "|" и добавьте и добавьте круглые скобки и шаблоны для захвата контекста. Сопоставить строку с регулярным выражением.

Некоторые примеры шаблонов префиксов и суффиксов:

  • ".{,15}(", ").{,15}" для соответствия до 15 символов
  • "(\w+\W+){,4}(", ")(\W+\w+){,4}" для соответствия до 4 слов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...