如何使用NSScanner?

Zop*_*opi 16 string cocoa parsing objective-c nsscanner

我刚读苹果的实况 NSScanner的.我正在尝试获取该字符串的整数:@"用户记录(3次尝试)".

我找不到任何例子,如何在括号内扫描.有任何想法吗?

这是代码:

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

[aScanner scanInteger:anInteger];

NSLog(@"Attempts: %i", anInteger);
Run Code Online (Sandbox Code Playgroud)

NSR*_*der 50

Ziltoid的解决方案可行,但它的代码比您需要的多.

对于给定的情况,我不打算实例化NSScanner.NSCharacterSet和NSString为您提供所需的一切:

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

或者在Swift中:

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

  • `invertedSet`很好!我不知道那种方法.我不记得以前我是如何解决这个问题的,但它肯定不如此优雅. (3认同)

Zil*_*oid 17

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

首先我定义了这个方法

- (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; 
}
Run Code Online (Sandbox Code Playgroud)

然后打电话给它.

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

leftOffset是左侧字符串的字符数

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


小智 5

NSScanner是一个线性扫描仪.你必须扫描你不想达到你想要的东西.

你可以[aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL]跳过一切到数字角色.然后你[aScanner scanInteger:&anInteger]可以将字符扫描成一个整数.


zap*_*aph 5

这是一个使用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]);
Run Code Online (Sandbox Code Playgroud)

NSLog输出:

Attempts: 3
Run Code Online (Sandbox Code Playgroud)