在Objective C中,围绕多个模式提取多个文本子串的最佳方法是什么?

时间:2010-03-13 03:38:31

标签: iphone objective-c nsstring

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

所以,如果我有“快速的棕色狐狸跳过懒狗”,我的模式是“棕色”和“懒惰”,我想得到“快速棕色狐狸”和“懒狗”。但是,子字符串不一定需要用空格分隔。

另一个例子是,如果你有多段文字并希望在文本中找到“红色”和“蓝色”的所有实例,但你想在上下文中显示“红色”和“蓝色”的实例,但是通过“上下文”你不关心上下文是否以文本正文中的单词的开头或结尾开始和结束,所以如果你在文本正文中有一个句子为“有很多树上的红鸭子“结果可能是”“或”红色鸭子中的大量红鸭子“并且没关系 - 我不是在寻找基于空白的解决方案。它可能只是找到“红色”并获得“红色”的子串,前面的10个字符和后面的10个字符。

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

2 个答案:

答案 0 :(得分:6)

我认为你想要的是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:来获取数组,然后返回元素+ 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:@" "];

(这里的所有示例都缺少必要的错误检查,但这只是为了让您了解如何做到这一点。)

答案 1 :(得分:3)

您可以使用第三方框架提供的正则表达式(例如RegexKitRegexKitLite)。要创建RE,join模式为“|”并在前缀和附加括号和模式以捕获上下文。 Match反对正则表达式的字符串。

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

  • ".{,15}("").{,15}"最多匹配15个字符
  • "(\w+\W+){,4}("")(\W+\w+){,4}"最多匹配4个字