2012-11-16 4 views
-1

아래 NSString이 있습니다. 나는 각 어플리케이션의 이름과 그 위치를 알기 원합니다. 누군가 나를 도와 주거나 올바른 방향으로 나를 가리킬 수 있습니까? 미리 감사드립니다. 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 

답변

0

구분 기호가 쉬운 경우 componentsSeparatedByString을 사용합니다. 그렇지 않다면 NSRegularExpression이있는 정규식을 사용하여 값을 찾으십시오.

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에서 오류를 확인한다는 것은 말할 필요도 없습니다. (맨 처음에는 문자열 끝을 확인해야합니다.) 또한이 스 니펫은 사용자가 제공 한 것과 같이 데이터를 엄격하게 표현한 방식에 의존합니다.

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; 
}