在NSString中的每个单词上调用一个方法

时间:2012-06-23 16:14:15

标签: objective-c string cocoa cocoa-touch nsstring

我想循环遍历NSString并在每个具有特定标准的单词上调用自定义函数(例如,“has 2'L's”)。我想知道接近的最佳方式是什么。我应该使用查找/替换模式吗?块?

-(NSString *)convert:(NSString *)wordToConvert{
    /// This I have already written
    Return finalWord;
}

-(NSString *) method:(NSString *) sentenceContainingWords{
    // match every word that meets the criteria (for example the 2Ls) and replace it with what convert: does. 
}

4 个答案:

答案 0 :(得分:20)

要枚举字符串中的字词,您应该将-[NSString enumerateSubstringsInRange:options:usingBlock:]NSStringEnumerationByWordsNSStringEnumerationLocalized一起使用。列出的所有其他方法都使用一种识别单词的方法,这些单词可能不适合于语言环境或与系统定义相对应。例如,用逗号分隔但用空格分隔的两个单词(例如“foo,bar”)不会被任何其他答案视为单独的单词,但它们在Cocoa文本视图中。

[aString enumerateSubstringsInRange:NSMakeRange(0, [aString length])
                            options:NSStringEnumerationByWords | NSStringEnumerationLocalized
                         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
    if ([substring rangeOfString:@"ll" options:NSCaseInsensitiveSearch].location != NSNotFound)
        /* do whatever */;
}];

-enumerateSubstringsInRange:options:usingBlock:所述,如果您在可变字符串上调用它,则可以安全地改变enclosingRange 中正在枚举的字符串。因此,如果您想要替换匹配的单词,可以使用[aString replaceCharactersInRange:substringRange withString:replacementString]

之类的内容

答案 1 :(得分:1)

如果您可以使用正则表达式编写标准,那么您可以进行正则表达式匹配以获取这些单词,然后将它们传递给convert:方法。

您还可以使用componentsSeparatedByString:componentsSeparatedByCharactersInSet:将字符串拆分为单词数组,然后查看数组中的单词并检测它们是否符合您的标准。如果它们合适,则将它们传递给convert:

希望这有帮助。

答案 2 :(得分:1)

我知道循环一个适合你的数组的两种方式如下:

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

for (NSString *word in words)
{
    NSString *transformedWord = [obj method:word];
}

NSArray *words = [sentence componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

[words enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id word, NSUInteger idx, BOOL *stop){
    NSString *transformedWord = [obj method:word];
}];

另一种方法–makeObjectsPerformSelector:withObject:不适合您。它希望能够调用[word method:obj],这是你期望的结果。

答案 3 :(得分:-1)

我建议使用while循环来完成这样的字符串。

NSRange spaceRange = [sentenceContainingWords rangeOfString:@" "];
NSRange previousRange = (NSRange){0,0};
do {
   NSString *wordString;
   wordString = [sentenceContainingWord substringWithRange:(NSRange){previousRange.location+1,(spaceRange.location-1)-(previousRange.location+1)}];
   //use the +1's to not include the spaces in the strings
   [self convert:wordString];
   previousRange = spaceRange;
   spaceRange = [sentenceContainingWords rangeOfString:@" "];
} while(spaceRange.location != NSNotFound);

这段代码可能需要重写,因为它非常粗糙,但你应该明白这一点。

编辑:刚刚看到雅各布戈尔班的帖子,你肯定应该这样做。