18

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

@"user logged (3 attempts)"

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

这是代码:

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

[aScanner scanInteger:anInteger];

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

5 回答 5

52

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

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

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

或在斯威夫特:

    let logString = "user logged (3 attempts)"
    let nonDigits = NSCharacterSet.decimalDigitCharacterSet().invertedSet
    let digits : NSString = logString.stringByTrimmingCharactersInSet(nonDigits)
    NSLog("Attempts: %i", digits.intValue)
于 2009-08-20T08:24:33.737 回答
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; 
}

然后调用它。

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

leftOffset 是左字符串的字符数

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

于 2009-02-27T14:00:46.577 回答
6

这是一个使用 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
于 2011-12-03T14:09:07.867 回答
5

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

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

于 2009-08-13T17:07:27.330 回答
1

这是正则表达式的用法

NSString *logString = @"user logged (3 attempts)";
NSString * digits = [logString stringByMatching:@"([+\\-]?[0-9]+)" capture:1];
于 2016-03-02T14:35:02.907 回答