【问题标题】:iOS Get String between 2 StringsiOS获取2个字符串之间的字符串
【发布时间】:2015-02-18 10:55:34
【问题描述】:

如何获得两个已知字符串之间的字符串?例如:

<id> 100 </id>

我想从这个字符串中得到 100。

我已经尝试过这段代码,但它不起作用。 NSLog 是:

<id>100

代码:

NSString *serverOutput = @"<id>100</id>";
NSRange start = [serverOutput rangeOfString:@"<id>"];
NSRange end = [serverOutput rangeOfString:@"</id>"];
NSLog(@"%@",[serverOutput substringWithRange:NSMakeRange(start.location, end.location)]);

【问题讨论】:

  • 如果是 XML 为什么不使用 XML 解析器?
  • 不。这只是一个例子:D

标签: ios objective-c swift string substring


【解决方案1】:

NSRange 是这样定义的:

typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;

所以,如果你想得到100,你应该像这样子串:

NSRange substringRange = NSMakeRange(start.location + start.length, end.location - start.length);
NSLog(@"%@", [serverOutput substringWithRange:substringRange]);

【讨论】:

    【解决方案2】:

    你几乎在那里,但范围位置是开始而不是结束。所以你必须添加范围的长度。

    由于您移动了字符串的开头,因此您需要使用偏移量来缩短长度:

    NSString *serverOutput = @"<id>100</id>";
    NSRange startRange = [serverOutput rangeOfString:@"<id>"];
    NSRange endRange = [serverOutput rangeOfString:@"</id>"];
    
    NSInteger start = NSMaxRange (startRange);
    NSInteger length = endRange.location - startRange.length;
    
    NSLog(@"%@", [serverOutput substringWithRange:NSMakeRange(start, length)]);
    

    【讨论】:

    • 是的,你是对的,如果可以使用一些错误检查。
    • 好答案。顺便说一句,将end 重命名为length 可能会为未来的读者增加清晰度。
    • @rckoenes 我认为NSMaxRange(startRange)startRange.location + startRange.length 更受欢迎。当一个函数已经存在可以为你做数学运算时,没有理由自己做数学题。
    【解决方案3】:
     NSString *serverOutput = @"<id>100</id>";
    serverOutput = [serverOutput stringByReplacingOccurrencesOfString:@"<id>" withString:@""];
    serverOutput = [serverOutput stringByReplacingOccurrencesOfString:@"</id>" withString:@""];
    
    NSLog(@"%@",serverOutput);
    

    【讨论】:

      【解决方案4】:

      我认为你应该使用正则表达式。

      NSString *serverOutput = @"<id>100</id>";
      NSString *pattern = @"<id>([0-9]+)</id>";
      NSError *error;
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                             options:NSRegularExpressionCaseInsensitive
                                                                               error:&error];
      NSTextCheckingResult *match = [regex firstMatchInString:serverOutput
                                                      options:NSMatchingReportProgress
                                                        range:NSMakeRange(0, serverOutput.length)];
      if (!error && match && match.numberOfRanges >= 2) {
          NSRange range = [match rangeAtIndex:1];
          NSLog(@"%@", [serverOutput substringWithRange:range]);
      }
      

      【讨论】:

        【解决方案5】:

        你想从第一个字符串的末尾开始,所以你只需要改变:

        NSLog(@"%@",[serverOutput substringWithRange:NSMakeRange(start.location, end.location)]);
        

        收件人:

        NSLog(@"%@",[serverOutput substringWithRange:NSMakeRange(NSMaxRange(start), end.location - start.length)]);
        

        请注意,我还减去了起始字符串的长度,因为我们只是偏移了那么多。

        【讨论】:

          【解决方案6】:

          Swift 中:

          extension String {
          
              func slice(from: String, to: String) -> String? {
          
                  return (range(of: from)?.upperBound).flatMap { substringFrom in
                      (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
                          String(self[substringFrom..<substringTo])
                      }
                  }
              }
          }
          

          输入

          let serverOutput = "<id>100</id>"
          let resultString = serverOutput.slice(from: "<id>", to: "</id>")
          print(resultString)
          

          输出

          100

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-06
            • 1970-01-01
            • 2012-12-28
            相关资源
            最近更新 更多