【问题标题】:How to use NSScanner?如何使用 NSScanner?
【发布时间】:2009-02-27 13:42:04
【问题描述】:

我刚刚阅读了Apple documentationNSScanner。 我正在尝试获取此字符串的整数:

@"user logged (3 attempts)"

我找不到任何示例,如何在括号内扫描。有什么想法吗?

代码如下:

NSString *logString = @"user logged (3 attempts)";
NSScanner *aScanner = [NSScanner scannerWithString:logString];

[aScanner scanInteger:anInteger];

NSLog(@"Attempts: %i", anInteger);

【问题讨论】:

    标签: objective-c string cocoa parsing nsscanner


    【解决方案1】:

    Ziltoid 的解决方案有效,但它的代码比您需要的要多。

    对于给定的情况,我不会费心实例化 NSScanner。 NSCharacterSet 和 NSString 为您提供所需的一切:

        NSString *logString = @"user logged (3 attempts)";
        NSString *digits = [logString stringByTrimmingCharactersInSet:
             [[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
        NSLog(@"Attempts: %i", [digits intValue]);
    

    或在 Swift 中:

        let logString = "user logged (3 attempts)"
        let nonDigits = NSCharacterSet.decimalDigitCharacterSet().invertedSet
        let digits : NSString = logString.stringByTrimmingCharactersInSet(nonDigits)
        NSLog("Attempts: %i", digits.intValue)
    

    【讨论】:

    • invertedSet 不错!我不知道这种方法。我不记得我以前是如何解决这个问题的,但它肯定没有这个优雅。
    【解决方案2】:

    这是一个使用 NSScanner 的简单解决方案(是的,@NSResponder 有一个非常巧妙的解决方案!):

    NSString *logString = @"user logged (3 attempts)";
    NSString *numberString;
    NSScanner *scanner = [NSScanner scannerWithString:logString];
    [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil];
    [scanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&numberString];
    NSLog(@"Attempts: %i", [numberString intValue]);
    

    NSLog 输出:

    Attempts: 3
    

    【讨论】:

      【解决方案3】:

      `这是我从字符串中获取某些值的方法

      首先我定义了这个方法

      - (NSString *)getDataBetweenFromString:(NSString *)data leftString:(NSString *)leftData rightString:(NSString *)rightData leftOffset:(NSInteger)leftPos; 
      {         
          NSInteger left, right;         
          NSString *foundData;
          NSScanner *scanner=[NSScanner scannerWithString:data];                  
          [scanner scanUpToString:leftData intoString: nil];         
          left = [scanner scanLocation];         
          [scanner setScanLocation:left + leftPos];         
          [scanner scanUpToString:rightData intoString: nil];         
          right = [scanner scanLocation] + 1;         
          left += leftPos;         
          foundData = [data substringWithRange: NSMakeRange(left, (right - left) - 1)];         return foundData; 
      }
      

      然后调用它。

      foundData = [self getDataBetweenFromString:data leftString:@"user logged (" rightString:@"attempts)" leftOffset:13];
      

      leftOffset 是左边字符串的字符数

      可能是一种更简单的清洁方式,但这是我的解决方案。

      【讨论】:

      • 你不需要leftPos。这可以通过使用 [leftData length] 调用找到。然而,这对于动态捕获字符串之间的数据非常有用。 +1
      • @Kalle: NULLnil 定义完全相同,但含义不同。在这种情况下,nil 是正确的。 stackoverflow.com/questions/1841983/…
      • 谢谢你——我删除了有问题的评论。是的,NULL 和 nil 是相同的。
      【解决方案4】:

      NSScanner 是线性扫描仪。你必须扫描你不想得到的东西才能找到你想要的东西。

      您可以使用[aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL] 跳过所有内容直到数字字符。然后你用[aScanner scanInteger:&anInteger] 把字符扫描成一个整数。

      【讨论】:

        【解决方案5】:

        这里是正则表达式的用法

        NSString *logString = @"user logged (3 attempts)";
        NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-03
          • 2012-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          相关资源
          最近更新 更多