How to use NSScanner?

前端 未结 5 1571
走了就别回头了
走了就别回头了 2020-11-27 17:40

I\'ve just read Apple\'s docu of NSScanner. I\'m trying to get the integer of that string: @\"user logged (3 attempts)\".

I can\'t find any example, how to scan with

相关标签:
5条回答
  • 2020-11-27 18:04

    `Here is what I do to get certain values out of a string

    First I have this method defined

    - (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; 
    }
    

    Then call it.

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

    leftOffset is the number of characters for the left string

    Could be an easier cleaner way but that was my solution.

    0 讨论(0)
  • 2020-11-27 18:13

    Here is a simple solution using NSScanner (yes, @NSResponder has a really neat solution!):

    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 output:

    Attempts: 3
    
    0 讨论(0)
  • 2020-11-27 18:14

    Ziltoid's solution works, but it's more code than you need.

    I wouldn't bother instantiating an NSScanner for the given situation. NSCharacterSet and NSString give you all you need:

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

    or in Swift:

        let logString = "user logged (3 attempts)"
        let nonDigits = NSCharacterSet.decimalDigitCharacterSet().invertedSet
        let digits : NSString = logString.stringByTrimmingCharactersInSet(nonDigits)
        NSLog("Attempts: %i", digits.intValue)
    
    0 讨论(0)
  • 2020-11-27 18:15

    here is the reg-ex usage

    NSString *logString = @"user logged (3 attempts)";
    NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1];
    
    0 讨论(0)
  • 2020-11-27 18:18

    NSScanner is a linear scanner. You have to scan through the stuff you don't want to get to what you do want.

    You could do [aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL] to jump past everything up to the number character. Then you do [aScanner scanInteger:&anInteger] to scan the character into an integer.

    0 讨论(0)
提交回复
热议问题