我想循环遍历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.
}
答案 0 :(得分:20)
要枚举字符串中的字词,您应该将-[NSString enumerateSubstringsInRange:options:usingBlock:]
与NSStringEnumerationByWords
和NSStringEnumerationLocalized
一起使用。列出的所有其他方法都使用一种识别单词的方法,这些单词可能不适合于语言环境或与系统定义相对应。例如,用逗号分隔但用空格分隔的两个单词(例如“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);
这段代码可能需要重写,因为它非常粗糙,但你应该明白这一点。
编辑:刚刚看到雅各布戈尔班的帖子,你肯定应该这样做。