Iphone 在目标C中,什么';围绕多个模式提取多个子字符串的最佳方法是什么?

Iphone 在目标C中,什么';围绕多个模式提取多个子字符串的最佳方法是什么?,iphone,objective-c,nsstring,Iphone,Objective C,Nsstring,对于一个NSString,我有N个模式字符串。我想提取模式匹配周围的子字符串 因此,如果我有“快速棕色狐狸跳过了懒狗”,并且我的模式是“棕色”和“懒狗”,我希望得到“快速棕色狐狸”和“懒狗”。但是,子字符串不一定需要用空格分隔 另一个例子是,如果你有多个文本段落,想在文本中找到“红色”和“蓝色”的所有实例,但你想在上下文中显示“红色”和“蓝色”的实例,但通过“上下文”,你不在乎上下文是否以文本正文中单词的开头或结尾开始和结束,因此,如果你在正文中有一句话是“树上有很多红鸭子”,那么结果可能是“树

对于一个NSString,我有N个模式字符串。我想提取模式匹配周围的子字符串

因此,如果我有“快速棕色狐狸跳过了懒狗”,并且我的模式是“棕色”和“懒狗”,我希望得到“快速棕色狐狸”和“懒狗”。但是,子字符串不一定需要用空格分隔

另一个例子是,如果你有多个文本段落,想在文本中找到“红色”和“蓝色”的所有实例,但你想在上下文中显示“红色”和“蓝色”的实例,但通过“上下文”,你不在乎上下文是否以文本正文中单词的开头或结尾开始和结束,因此,如果你在正文中有一句话是“树上有很多红鸭子”,那么结果可能是“树上有很多红鸭子”或“树上有很多红鸭子”,这没关系——我不是在寻找基于空格的解决方案。它可能只是找到“red”,然后得到子字符串“red”,以及前面的10个字符和后面的10个字符


换句话说,有一些基于“范围”的字符串匹配函数。我希望有一种简单的方法可以同时匹配多个字符串,并返回每个字符串的匹配点加上周围的字符。

我想您需要的是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"
要获得上下文,您需要确定在“brown”被发现的位置周围要包含多少内容

当您总是在寻找单词时,作为一种替代解决方案,您可以使用NSString的
组件通过string:
获得一个数组,然后返回该数组周围的元素+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:@" "];

(这里的所有示例都缺少必要的错误检查,但这只是为了让您了解可以执行类似操作的方法。)

您可以使用第三方框架(例如或)提供的正则表达式。要创建RE,请使用带“|”的模式以及前置和追加括号和模式来捕获上下文。针对regexp的字符串

一些前缀和后缀模式示例:

  • “{,15}(
    ”)。{,15}”
    以匹配最多15个字符
  • “(\w+\w+{,4}(
    ”)(\w+\w+{,4}“
    )以匹配最多4个单词

这似乎不够具体。您给出的示例似乎是,“模式”返回的文本与模式文本之间的间隔不超过一个空格。但如果它们没有空格分隔,我们怎么知道返回什么呢?编辑以更清楚。添加我对RegexKitLite的投票。您可以将结果作为匹配捕获组件的数组或范围数组获得,这些范围告诉您匹配组件在字符串中的位置。它应该能够满足你的所有要求。