【问题标题】:Call a method on every word in NSString对 NSString 中的每个单词调用一个方法
【发布时间】:2012-06-25 15:06:08
【问题描述】:

我想遍历 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. 
}

【问题讨论】:

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


    【解决方案1】:

    要枚举字符串中的单词,您应该使用-[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]这样的东西。

    【讨论】:

      【解决方案2】:

      我知道的循环数组的两种方法对你有用:

      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],这与您的期望相反。

      【讨论】:

      • 对于一些语言,如中文、日文、德文,空格不是单词之间的明显限制,因此Ken方法是正确的。
      【解决方案3】:

      我建议使用 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 的帖子,你绝对应该这样做。

      【讨论】:

        【解决方案4】:

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

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

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多