【问题标题】:How to split strings into substring start with some characters in ios如何将字符串拆分为以ios中的某些字符开头的子字符串
【发布时间】:2013-11-18 08:31:13
【问题描述】:

我一直在寻找将字符串拆分为子字符串的解决方案。我需要一些正确的逻辑,我需要读取以某个字符开头的字符串,并且它应该包含至少 17 个字符。

例如"43 01 08 43 13 01 18 FD 48 6B D1 43 01 22 02 01 02 02 F1 48 6B D1 43 02 03 03 51 03 52 75 48 6B D1 43 03 53 11 08 15 52 9D 48 6B D1 43 16 14 16 32 00 00"

对于上面的字符串,我需要拆分成 “43 01 08 43 13 01 18” “43 01 22 02 01 02 02” “43 02 03 03 51 03 52” “43 03 53 11 08 15 52” "43 16 14 16 32 00 00"

So On... 我的意思是我需要获取“43”的位置,然后从它的索引中我需要读取 20 个字符(包括空格)并拒绝这些字符,直到出现下一个“43”(粗体字符为上文提到的)。提前谢谢.. :)

【问题讨论】:

  • 显示您尝试过的内容??
  • 我相信 NSScanner 是处理这类逻辑的最佳方式。
  • 我正在尝试pastebin.com/cHpGL1Gr 的示例代码,但如果有任何响应在字符串之间包含“43”,那么它将无法正常工作!!
  • 您说您需要从“43”中读取 20 个字符,但在您提供的示例中,您似乎只读取了 10 个...
  • @neutrino blankSpace 也是一个字符!! :)

标签: ios objective-c nsstring substring nsrange


【解决方案1】:

我将只使用rangeOfString: 来定位接下来的 43 个字符,然后使用 substringWithRange: 从那里取出 20 个字符,然后从剩余的子字符串 (substringFromIndex:) 重新开始。

NSString *str = @"43 01 08 43 13 01 18 FD 48 6B D1 43 01 22 02 01 02 02 F1 48 6B D1 43 02 03 03 51 03 52 75 48 6B D1 43 03 53 11 08 15 52 9D 48 6B D1 43 16 14 16 32 00 00";
NSMutableArray *substrings = [NSMutableArray array];
NSRange range = { .length = 20 };
while ((range.location = [str rangeOfString:@"43"].location) != NSNotFound
       && str.length >= range.length + range.location) {
    [substrings addObject:[str substringWithRange:range]];
    str = [str substringFromIndex:range.location + range.length];
}

【讨论】:

    【解决方案2】:

    试试这个:

       NSMutableArray *output = [[NSMutableArray alloc] init];
        NSString *allString = @"43 01 08 43 13 01 18 FD 48 6B D1 43 01 22 02 01 02 02 F1 48 6B D1 43 02 03 03 51 03 52 75 48 6B D1 43 03 53 11 08 15 52 9D 48 6B D1 43 16 14 16 32 00 00";
    
        while (allString.length>0) {
            [output addObject:[allString substringToIndex:20]];
            allString = [allString substringFromIndex:20];
            NSArray *arr = [allString componentsSeparatedByString:@"43"];
    
           if (arr.count>1){
              allString =@"43";
              for (int i=1;i<arr.count;i++){
                  allString = [allString stringByAppendingString:[arr objectAtIndex:i]];
              }
           }else{
              allString=@"";
           }
    
        }
    

    【讨论】:

      【解决方案3】:

      假设您的序列始终以“43”开头并且有七个项目。

      拆分字符串并沿着数组创建子数组。

      -(NSArray *)splitString:(NSString *)masterString
      {
          NSArray *values = [masterString componentsSeparatedByString:@" "];
      
          NSMutableArray *outputarray = [@[] mutableCopy];
      
          NSUInteger marker = 0;
      
          NSString *startValue = @"43";
      
          NSUInteger subarraycount = 7;
      
          BOOL foundFlag = YES;
      
          while (foundFlag) {
      
              NSRange checkRange = NSMakeRange(marker, (values.count - marker));
      
              NSUInteger next = [values indexOfObject:startValue inRange:checkRange];
      
              foundFlag = (next != NSNotFound) && ((next + subarraycount) < values.count);
      
              if (foundFlag) {
      
                  NSRange subrange = NSMakeRange(next, subarraycount);
      
                  NSArray *subarray = [values subarrayWithRange:subrange];
      
                  [outputarray addObject:[subarray componentsJoinedByString:@" "]];
      
                  marker = next + subarraycount;
              }
      
          }
      
          return [outputarray copy];
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-10
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        相关资源
        最近更新 更多