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 に答える