5

我想遍历一个NSString并在每个具有特定标准的单词上调用一个自定义函数(例如,“有 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

4 回答 4

20

要枚举字符串中的单词,您应该使用-[NSString enumerateSubstringsInRange:options:usingBlock:]withNSStringEnumerationByWordsNSStringEnumerationLocalized。列出的所有其他方法都使用一种识别可能不适合区域设置或不符合系统定义的单词的方法。例如,由逗号分隔但不是空格的两个单词(例如“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].

于 2012-06-23T18:15:31.953 回答
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]与您期望的相反的。

于 2012-06-23T16:48:47.783 回答
1

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

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

希望这可以帮助。

于 2012-06-23T16:33:49.820 回答
-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);

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

编辑:刚刚看到 Jacob Gorban 的帖子,你绝对应该这样做。

于 2012-06-23T16:34:46.713 回答