В Objective C, каков наилучший способ извлечь несколько подстрок текста вокруг нескольких шаблонов?

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

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

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

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

2 ответа

Решение

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

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

  • ".{,15}(", ").{,15}" соответствовать до 15 символов
  • "(\w+\W+){,4}(", ")(\W+\w+){,4}" до 4 слов

Я думаю, что вы хотите, это 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"

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

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

 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:@" "];

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

Другие вопросы по тегам