В 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:@" "];
(Во всех примерах здесь отсутствует необходимая проверка ошибок, но это просто для того, чтобы дать вам представление о том, как вы можете делать такие вещи.)