发生时NSString字符串的范围

时间:2010-09-24 09:20:13

标签: iphone objective-c

我正在尝试构建一个函数,它会告诉我一个字符串的出现范围。

例如,如果我有字符串“hello,hello,hello”,我想知道它的问候范围,比方说,第三次出现。

我已经尝试构建这个简单的函数,但它不起作用。

注意 - 顶级函数是在较早的日期构建的,并且工作正常。

任何帮助表示感谢。

- (NSString *)stringByTrimmingString:(NSString *)stringToTrim toChar:(NSUInteger)toCharacterIndex {

   if (toCharacterIndex > [stringToTrim length]) return @"";

   NSString *devString = [[[NSString alloc] init] autorelease];

   for (int i = 0; i <= toCharacterIndex; i++) {

   devString = [NSString stringWithFormat:@"%@%@", devString, [NSString stringWithFormat:@"%c", [stringToTrim characterAtIndex:(i-1)]]]; 

   }

   return devString;

   [devString release];
   }

- (NSString *)stringByTrimmingString:(NSString *)stringToTrim fromChar:(NSUInteger)fromCharacterIndex {
   if (fromCharacterIndex > [stringToTrim length]) return @"";
   NSString *devString = [[[NSString alloc] init] autorelease];
   for (int i = (fromCharacterIndex+1); i <= [stringToTrim length]; i++) {
       devString = [NSString stringWithFormat:@"%@%@", devString, [NSString stringWithFormat:@"%c", [stringToTrim characterAtIndex:(i-1)]]]; 
   }
   return devString;
   [devString release];
}



- (NSRange)rangeOfString:(NSString *)substring inString:(NSString *)string atOccurence:(int)occurence {

   NSString *trimmedString = [inString copy]; //We start with the whole string.
   NSUInteger len, loc, oldLength;
   len = 0;
   loc = 0;


   NSRange tempRange = [string rangeOfString:substring];
   len = tempRange.length;
   loc = tempRange.location;

   for (int i = 0; i != occurence; i++) {

      NSUInteger endOfWord = len+loc;

      trimmedString = [self stringByTrimmingString:trimmedString fromChar:endOfWord];

      oldLength += [[self stringByTrimmingString:trimmedString toChar:endOfWord] length];

      NSRange tmp = [trimmedString rangeOfString:substring];
      len = tmp.length;
      loc = tmp.location + oldLength;

   }

   NSRange returnRange = NSMakeRange(loc, len);

   return returnRange;

}

2 个答案:

答案 0 :(得分:6)

不要一次修剪字符串(慢),只需使用rangeOfString:options:range:,它只在作为第三个参数传递的范围内搜索。请参阅Apple's documentation

所以试试:

- (NSRange)rangeOfString:(NSString *)substring
                inString:(NSString *)string
             atOccurence:(int)occurence
{
  int currentOccurence = 0;
  NSRange rangeToSearchWithin = NSMakeRange(0, string.length);

  while (YES)
  {
    currentOccurence++;
    NSRange searchResult = [string rangeOfString: substring
                                         options: NULL
                                           range: rangeToSearchWithin];

    if (searchResult.location == NSNotFound)
    {
      return searchResult;
    }
    if (currentOccurence == occurence)
    {
      return searchResult;
    }

    int newLocationToStartAt = searchResult.location + searchResult.length;
    rangeToSearchWithin = NSMakeRange(newLocationToStartAt, string.length - newLocationToStartAt);
  }
}

答案 1 :(得分:2)

您需要重新编写整个代码。虽然它似乎有效但编码很差而且完全错误,比如永久重新分配相同的变量,初始化但稍后重新分配一行,在返回后释放(这将永远不会起作用)。

对于你的问题:只需使用rangeOfString:options:range:,并在增加起点时适当地执行此操作。