-1

この NSString を以下に示します。各アプリケーションの名前とその場所を取得できるようにしたい。誰かが私を助けたり、正しい方向に向けたりできますか? 前もって感謝します。

Applications:

Xcode:

  Version: 4.5.2
  Last Modified: 11/3/12 11:45 PM
  Kind: Intel
  64-Bit (Intel): Yes
  App Store: Yes
  Location: /Applications/Xcode.app

Terminal:

  Version: 2.3
  Last Modified: 6/21/12 12:01 AM
  Kind: Intel
  64-Bit (Intel): Yes
  App Store: No
  Location: /Applications/Utilities/Terminal.app

Google Chrome:

  Version: 23.0.1271.64
  Last Modified: 10/31/12 7:59 PM
  Kind: Intel
  64-Bit (Intel): No
  App Store: No
  Location: /Applications/Google Chrome.app

App Store:

  Version: 1.2.1
  Last Modified: 4/18/12 7:52 PM
  Kind: Intel
  64-Bit (Intel): Yes
  App Store: No
  Location: /Applications/App Store.app
4

3 に答える 3

1

文字列を使用して NSScanner のインスタンスを作成します。NSScanner のインスタンスはデフォルトで空白と改行をスキップするため、次のように、先に進む前にこの動作を無効にする必要があります。

[scanner setCharactersToBeSkipped:[[[NSCharacterSet alloc] init] autorelease]];

ここから、次のようにします。

NSString *appName = nil;

[scanner scanString:@"Applications:" intoString:NULL];

NSCharacterSet *charset = [NSCharacterSet newlineCharacterSet];

[scanner scanCharactersFromSet:charset intoString:NULL];

while ([scanner isAtEnd] == NO)
{
    // Get your application name.
    [scanner scanUpToCharactersFromSet:charset intoString:&appName];
    [scanner scanCharactersFromSet:charset intoString:NULL];

    // You could do something with your application name here.

    // Skip over the other stuff.
    for (NSUInteger idx = 0; idx < 6; idx++)
    {
        [scanner scanUpToString:@":" intoString:NULL];
        [scanner scanString:@":" intoString:NULL];
        [scanner scanUpToCharactersFromSet:charset intoString:NULL];
        [scanner scanCharactersFromSet:charset intoString:NULL];
    }
}

見た目にも関わらず、完全な解決策を提供していないことに注意してください。文字列の終わりをチェックする以外に、エラー チェックはありません。Real Applications がエラーをチェックすることは言うまでもありません。(最初に文字列の終わりのチェックさえあったはずです。)また、このスニペットは、あなたが提供したようなデータの厳密な表現に依存しています。

于 2012-11-16T20:27:45.653 に答える
0

これを解決する方法はたくさんあります。 NSRegularExpressionが言及されています。 NSScanner別のものです。これが潜在的な解決策です(正確性についての保証はありません-単なるガイドです。)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSString *source = @"Applications:\n\nXcode:\n\n  Version: 4.5.\n  Last Modified: 11/3/12 11:45 PM\n  Kind: Intel\n  64-Bit (Intel): Yes\n App Store: Yes\n  Location: /Applications/Xcode.app";
        NSScanner *scanner = [NSScanner scannerWithString:source];
        [scanner scanUpToString:@":" intoString:NULL];
        [scanner scanString:@":" intoString:NULL];

        while( ![scanner isAtEnd] ) {
            NSString *appName = nil;
            NSString *appPath = nil;

            [scanner scanUpToCharactersFromSet:[NSCharacterSet alphanumericCharacterSet] intoString:NULL];
            [scanner scanCharactersFromSet:[NSCharacterSet alphanumericCharacterSet] intoString:&appName];

            NSString *junk = nil;
            [scanner scanUpToString:@"Location: " intoString:&junk];
            [scanner scanString:@"Location: " intoString:NULL];
            [scanner scanUpToString:@"\n" intoString:&appPath];
            [scanner scanString:@"\n" intoString:NULL];

            printf("app name = %s, path = %s\n",[appName UTF8String],[appPath UTF8String]);
        }

    }
    return 0;
}
于 2012-11-16T20:35:37.007 に答える
0

簡単な区切り文字がある場合は、componentsSeparatedByString を使用します。そうでない場合は、値を見つけるために NSRegularExpression で正規表現を使用してみてください

于 2012-11-16T18:22:10.463 に答える