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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 21:12:07  来源:igfitidea点击:

How to use NSScanner?

objective-cstringcocoaparsingnsscanner

提问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];