objective-c 如何使用 NSScanner?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/594797/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use NSScanner?
提问by Zopi
I've just read Apple's docuof NSScanner. I'm trying to get the integer of that string: @"user logged (3 attempts)".
我刚读苹果的实况NSScanner的。我正在尝试获取该字符串的整数:@“用户已登录(3 次尝试)”。
I can't find any example, how to scan within parentheses. Any ideas?
我找不到任何示例,如何在括号内扫描。有任何想法吗?
Here's the code:
这是代码:
NSString *logString = @"user logged (3 attempts)";
NSScanner *aScanner = [NSScanner scannerWithString:logString];
[aScanner scanInteger:anInteger];
NSLog(@"Attempts: %i", anInteger);
回答by NSResponder
Ziltoid's solution works, but it's more code than you need.
Ziltoid 的解决方案有效,但它的代码比您需要的要多。
I wouldn't bother instantiating an NSScanner for the given situation. NSCharacterSet and NSString give you all you need:
对于给定的情况,我不会费心实例化 NSScanner 。NSCharacterSet 和 NSString 为您提供所需的一切:
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)
回答by Ziltoid
`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
leftOffset 是左字符串的字符数
Could be an easier cleaner way but that was my solution.
可能是一种更简单的清洁方式,但这是我的解决方案。
回答by Zopi
NSScanneris a linear scanner. You have to scan through the stuff you don't want to get to what you do want.
NSScanner是线性扫描仪。你必须浏览你不想得到的东西,才能得到你想要的东西。
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.
您可以[aScanner scanUpToCharactersInSet:[NSCharacterSet decimalDigitCharacterSet] intoString:NULL]跳过所有内容直到数字字符。然后你做[aScanner scanInteger:&anInteger]把字符扫描成一个整数。
回答by zaph
Here is a simple solution using NSScanner (yes, @NSResponder has a really neat solution!):
这是一个使用 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 output:
NSLog 输出:
Attempts: 3
回答by Gal Blank
here is the reg-ex usage
这是正则表达式的用法
NSString *logString = @"user logged (3 attempts)";
NSString * digits = [logString stringByMatching:@"([+\-]?[0-9]+)" capture:1];

