【问题标题】:How do I get the substring between braces?如何获取大括号之间的子字符串?
【发布时间】:2013-02-04 05:35:09
【问题描述】:

我有一个这样的字符串。

NSString *myString = @"{53} balloons";

如何获取子字符串53

【问题讨论】:

  • Emmy,您是要在字符串中搜索它还是您已经知道字符串的位置(位置 1)并且您只想将其提取到另一个字符串中。
  • 如果您只是想提取大括号之间的子字符串,我赞同@iDroid 的回答。如果您要进行更复杂的搜索,请查看以下内容:stackoverflow.com/questions/4353834/…。尽管显然要记住使用这种方法的资源成本。
  • 没有。不知道53的位置,myString会是引擎生成的随机字符串。我需要在 {} 之间得到 53 作为答案。但我现在已经想好怎么做了。请参阅下面的答案。

标签: ios objective-c nsstring substring


【解决方案1】:

您可以使用正则表达式来获取大括号之间的数字。它可能看起来有点复杂,但好处是它会找到多个数字并且数字的位置无关紧要。

Swift 4.2:

let searchText = "{53} balloons {12} clowns {123} sparklers"
let regex = try NSRegularExpression(pattern: "\\{(\\d+)\\}", options: [])
let matches = regex.matches(in: searchText, options: [], range: NSRange(searchText.startIndex..., in: searchText))
matches.compactMap { Range($0.range(at: 1), in: searchText) }
       .forEach { print("Number: \(searchText[$0])") }

目标-C:

NSString *searchText = @"{53} balloons {12} clowns {123} sparklers";

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\{(\\d+)\\}" 
                                                                       options:0 
                                                                         error:nil];

NSArray *matches = [regex matchesInString:searchText 
                                  options:0 
                                    range:NSMakeRange(0, searchText.length)];

for (NSTextCheckingResult *r in matches)
{
    NSRange numberRange = [r rangeAtIndex:1];
    NSLog(@"Number: %@", [searchText substringWithRange:numberRange]);
}

这将打印出来:

Number: 53
Number: 12
Number: 123

【讨论】:

    【解决方案2】:

    对于 Swift 4.2:

    if let r1 = string.range(of: "{")?.upperBound,
    let r2 = string.range(of: "}")?.lowerBound {
        print (String(string[r1..<r2]))
    }
    

    【讨论】:

      【解决方案3】:

      对于 Swift 2.1:-

      var start = strData?.rangeOfString("{")
      var end = strData?.rangeOfString("}")
      if (start!.location != NSNotFound && end!.location != NSNotFound && end!.location > start!.location) {
          var betweenBraces = strData?.substringWithRange(NSMakeRange(start!.location + 1, end!.location-(start!.location + 1)))
          print(betweenBraces)
      }
      

      【讨论】:

        【解决方案4】:

        检查任意数量的数据:

          NSString *str = @"{53} balloons";
            NSArray* strary = [str componentsSeparatedByString: @"}"];
            NSString* str1 = [strary objectAtIndex: 0];
            NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"{" withString:@""];
            NSLog(@"number = %@",str2);
        

        另一种方法是

        NSString *tmpStr = @"{53} balloons";
        NSRange r1 = [tmpStr rangeOfString:@"{"];
        NSRange r2 = [tmpStr rangeOfString:@"}"];
        NSRange rSub = NSMakeRange(r1.location + r1.length, r2.location - r1.location - r1.length);
        NSString *subString = [tmpStr substringWithRange:rSub];
        

        【讨论】:

          【解决方案5】:

          这就是我所做的。

          NSString *myString = @"{53} balloons";
          NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"{}"];
          NSArray *splitString = [myString componentsSeparatedByCharactersInSet:delimiters];
          NSString *substring = [splitString objectAtIndex:1];
          

          子字符串是 53。

          【讨论】:

            【解决方案6】:
            NSString *myString = @"{53} balloons";
            NSRange start = [myString rangeOfString:@"{"];
            NSRange end = [myString rangeOfString:@"}"];
            if (start.location != NSNotFound && end.location != NSNotFound && end.location > start.location) {
                NSString *betweenBraces = [myString substringWithRange:NSMakeRange(start.location+1, end.location-(start.location+1))];
            }
            

            edit:添加了范围检查,感谢 Keab42 - 好点。

            【讨论】:

            • 你应该检查这两个范围不是 NSNotFound 并且 end.location > start.location
            • 感谢您的精彩回答。这是我所做的: NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"{}"]; NSArray *splitString = [myString componentsSeparatedByCharactersInSet:delimiters]; NSString *substring = [splitString objectAtIndex:1];子字符串是 53。
            【解决方案7】:

            如果你不知道会有多少位数,但你知道它总是用花括号括起来,试试这个:

            NSString *myString = @"{53} balloons";
            NSRange startRange = [myString rangeOfString:@"{"];
            NSRange endRange = [myString rangeOfString:@"}"];
            if (startRange.location != NSNotFound && endRange.location != NSNotFound && endRange.location > startRange.location) {
                NSString *value = [myString substringWithRange:NSMakeRange(startRange.location,endRange.ocation - startRange.location)];
            }
            

            不过,可能有一种更有效的方法。

            【讨论】:

              【解决方案8】:

              搜索“{”和“}”的位置。 在这些索引之间取子字符串。

              【讨论】:

              • 是的,他比我快
              【解决方案9】:

              我猜,您正在寻找NSScanner 类,至少如果您正在处理一般情况。看看苹果documentation

              【讨论】:

                【解决方案10】:

                试试这个代码。

                 NSString *myString = @"{53} balloons";
                 NSString *value = [myString substringWithRange:NSMakeRange(1,2)];
                

                【讨论】:

                • 如果你得到100个气球,你会在快乐的一天做什么?
                • 为什么不直接:NSString *value = @"53";
                • 我想她要了一个字符串!
                • @trojanfoe - 根据 OP 提供的信息,他的反应很好。如果 OP 想要灵活性,她将需要表明她的格式不是静态的。我们所知道的是,她有一个字符串,只是想从中提取 53。欢迎您花宝贵的时间提供一种灵活可重用的方法。
                • @Jeremy 我不同意。当然,这个问题是有缺陷的,但很明显,OP想要一个考虑括号的通用解决方案,而不仅仅是文本“53”的位置。
                猜你喜欢
                • 2023-03-16
                • 2016-03-24
                • 2016-08-30
                • 1970-01-01
                • 1970-01-01
                • 2013-02-28
                • 2014-12-04
                • 1970-01-01
                • 2012-07-15
                相关资源
                最近更新 更多