【问题标题】:Index of a character from the NSString in iOSiOS中NSString中字符的索引
【发布时间】:2013-05-21 04:52:43
【问题描述】:

我有一个NSString,例如"This is my question"。我想找到字符/子字符串"i" 的所有索引,即在这种情况下,如果索引从0 开始,那么我想要2,5,16 作为我的答案。

【问题讨论】:

标签: ios objective-c nsstring


【解决方案1】:

另一个答案有点矫枉过正。你为什么不简单地迭代这样的字符:

NSString *x = @"This is my question";

for (NSUInteger i=0;i<[x length];i++)
{
    if ([x characterAtIndex:i]=='i')
    {
        NSLog(@"found: %d", i);
    }
}

它准确地输出你的位置:

found: 2
found: 5
found: 16

【讨论】:

    【解决方案2】:

    我想提出我的解决方案。是这样的:

    NSString* str = @"This is my question";
    NSArray* arr = [str componentsSeparatedByString: @"i"];
    NSMutableArray* marr = [NSMutableArray arr];
    NSInteger cnt = 0;
    for (NSInteger i = 0; i < ([arr count]); i++)
    {
        NSString* s = [arr objectAtIndex: i];
        cnt += [s length];
        [marr addObject: [NSNumber numberWithInt: cnt]];
        cnt += [@"i" length];
    }
    
    NSLog(@"%@", [marr description]);
    

    在控制台上: 2 5 16

    【讨论】:

    • :我不想使用任何循环。有没有办法不使用任何循环?
    • 如果解决方案中有循环,@Pavitra 会有什么不同?
    • 你不能使用数组 containsObject: 或数组 indexOfObject: 甚至 - (NSRange)rangeOfString:(NSString *)aString?
    【解决方案3】:

    我不知道是否有任何内置函数可用于执行此操作。你可以使用这个方法:

    - (NSMutableArray *)indexOfCharacter:(char)c inString:(NSString*)string
    {
    
        NSMutableArray *returnArray = [[NSMutableArray alloc] init];
        for(int i=0;i<string.length;i++)
        {
            if(c == [string characterAtIndex:i])
            {
               [returnArray addObject:[NSNumber numberWithInt:i]];
            }
        }
        return returnArray;
    }
    

    【讨论】:

    • 我不想使用任何循环。有没有办法不使用任何循环?
    • @Pavitra:我认为没有。在没有任何循环的情况下找到所有位置是没有魔法的。如果有任何可用的内置函数,它也有一些循环或类似的东西来做到这一点。
    • 为什么不想使用循环?
    【解决方案4】:

    使用NSRange 和循环以及一些字符串操作,您可以轻松做到这一点。

            NSString *string = @"This is my question";
            NSString *substring = @"i";
    
            NSRange searchRange = NSMakeRange(0,string.length);
            NSRange foundRange;
            while (searchRange.location < string.length)
            {
                searchRange.length = string.length-searchRange.location;
                foundRange = [string rangeOfString:substring options:nil range:searchRange];
                if (foundRange.location != NSNotFound)
                {
                    // found an occurrence of the char
                    searchRange.location = foundRange.location+foundRange.length;
                    NSLog(@"Location of '%@' is %d",substring,searchRange.location-1);
                }
            }
    

    编辑

    使用NSRegularExpressionNSRange 你可以这样做。

    NSString *string = @"This is my question";
    NSString *substring = @"i";
    
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:substring
                                                                           options:0
                                                                             error:NULL];
    
    [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length])
                         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                             NSRange range = [result range];
                             NSLog(@"Location of '%@' is %d",substring, range.location);
                         }];
    

    输出是

    Location of 'i' is 2
    Location of 'i' is 5
    Location of 'i' is 16
    

    【讨论】:

      【解决方案5】:

      这是我尝试使用无循环代码来获得您想要的东西。我编写了这个盲代码,意思是未经测试等。它基本上是一个递归函数,但我认为它能让你大致了解。

      - (NSArray *)getAllEyes:(NSString *)s index:(int)index) {
          if (!s || s.length <= 0 || index >= s.length) return [NSArray new];
          NSRange *r = [s rangeOfString(@"i") options:NSLiteralSearch range:NSMakeRange(index, s.length - index)];
          if (r.location == NSNotFound) {
              return [NSArray new];
          } else {
              NSMutableArray *array = [NSMutableArray new];
              [array addObject:@(r.location)];
              [array addObjectsFromArray:[self getAllEyes:s index:r.location + 1]];
              return array;
          }    
      }
      
      // usage:
      
      NSArray *allEyes = [self getAllEyes:@""];
      for (NSNumber *n in allEyes) {
          NSLog(@"i = %@", n);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2023-03-26
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多