[objective-c] Objective-C에서 NSString 토큰 화

Objective-C에서 NSString을 토큰 화 / 분할하는 가장 좋은 방법은 무엇입니까?



답변

http://borkware.com/quickies/one?topic=NSString (유용한 링크) 에서이를 발견했습니다 .

NSString *string = @"oop:ack:bork:greeble:ponies";
NSArray *chunks = [string componentsSeparatedByString: @":"];

도움이 되었기를 바랍니다!

아담


답변

모든 사람들이 언급 componentsSeparatedByString:했지만 자연어를 토큰 화 CFStringTokenizer하는 ( NSStringCFString공백으로 단어를 나누지 않는 중국어 / 일본어와 같이) 상호 교환도 가능합니다.


답변

문자열을 나누려면을 사용하십시오 -[NSString componentsSeparatedByString:]. 보다 복잡한 토큰 화를 위해서는 NSScanner 클래스를 사용하십시오.


답변

토큰 화 요구가 더 복잡한 경우 오픈 소스 Cocoa String 토큰 화 / 파싱 툴킷 ParseKit을 확인하십시오.

http://parsekit.com

구분 문자 (예 : ‘:’)를 사용하여 문자열을 간단하게 분할하려면 ParseKit이 과도하게 사용됩니다. 그러나 복잡한 토큰 화 요구에 대해 ParseKit은 매우 강력하고 유연합니다.

ParseKit 토큰 화 문서 도 참조하십시오 .


답변

여러 문자를 토큰 화하려면 NSString을 사용할 수 있습니다 componentsSeparatedByCharactersInSet. NSCharacterSet에는 whitespaceCharacterSetand와 같은 편리한 사전 제작 세트 가 illegalCharacterSet있습니다. 그리고 유니 코드 범위의 이니셜 라이저가 있습니다.

다음과 같이 문자 세트를 결합하고이를 사용하여 토큰화할 수도 있습니다.

// Tokenize sSourceEntityName on both whitespace and punctuation.
NSMutableCharacterSet *mcharsetWhitePunc = [[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy];
[mcharsetWhitePunc formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
NSArray *sarrTokenizedName = [self.sSourceEntityName componentsSeparatedByCharactersInSet:mcharsetWhitePunc];
[mcharsetWhitePunc release];

그주의 componentsSeparatedByCharactersInSet는 행에서 charset 하나 명 이상의 멤버가 발생할 경우 1보다 작은 길이를 테스트 할 수 있습니다, 그래서 빈 문자열을 생성합니다.


답변

“인용구”를 유지하면서 문자열을 검색어로 토큰 화하려는 경우 NSString다양한 유형의 따옴표 쌍을 존중 하는 범주는 다음과 같습니다."" '' ‘’ “”

용법:

NSArray *terms = [@"This is my \"search phrase\" I want to split" searchTerms];
// results in: ["This", "is", "my", "search phrase", "I", "want", "to", "split"]

암호:

@interface NSString (Search)
- (NSArray *)searchTerms;
@end

@implementation NSString (Search)

- (NSArray *)searchTerms {

    // Strip whitespace and setup scanner
    NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSString *searchString = [self stringByTrimmingCharactersInSet:whitespace];
    NSScanner *scanner = [NSScanner scannerWithString:searchString];
    [scanner setCharactersToBeSkipped:nil]; // we'll handle whitespace ourselves

    // A few types of quote pairs to check
    NSDictionary *quotePairs = @{@"\"": @"\"",
                                 @"'": @"'",
                                 @"\u2018": @"\u2019",
                                 @"\u201C": @"\u201D"};

    // Scan
    NSMutableArray *results = [[NSMutableArray alloc] init];
    NSString *substring = nil;
    while (scanner.scanLocation < searchString.length) {
        // Check for quote at beginning of string
        unichar unicharacter = [self characterAtIndex:scanner.scanLocation];
        NSString *startQuote = [NSString stringWithFormat:@"%C", unicharacter];
        NSString *endQuote = [quotePairs objectForKey:startQuote];
        if (endQuote != nil) { // if it's a valid start quote we'll have an end quote
            // Scan quoted phrase into substring (skipping start & end quotes)
            [scanner scanString:startQuote intoString:nil];
            [scanner scanUpToString:endQuote intoString:&substring];
            [scanner scanString:endQuote intoString:nil];
        } else {
            // Single word that is non-quoted
            [scanner scanUpToCharactersFromSet:whitespace intoString:&substring];
        }
        // Process and add the substring to results
        if (substring) {
            substring = [substring stringByTrimmingCharactersInSet:whitespace];
            if (substring.length) [results addObject:substring];
        }
        // Skip to next word
        [scanner scanCharactersFromSet:whitespace intoString:nil];
    }

    // Return non-mutable array
    return results.copy;

}

@end


답변

언어 적 특징의 문자열 (단어, 단락, 문자, 문장 및 줄)을 분할하려면 문자열 열거를 사용하십시오.

NSString * string = @" \n word1!    word2,%$?'/word3.word4   ";

[string enumerateSubstringsInRange:NSMakeRange(0, string.length)
                           options:NSStringEnumerationByWords
                        usingBlock:
 ^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
     NSLog(@"Substring: '%@'", substring);
 }];

 // Logs:
 // Substring: 'word1'
 // Substring: 'word2'
 // Substring: 'word3'
 // Substring: 'word4' 

이 API는 공백이 항상 분리 문자가 아닌 다른 언어 (예 : 일본어)와 작동합니다. NSStringEnumerationByComposedCharacterSequences많은 비 서부 문자는 1 바이트 이상이므로 문자를 열거하는 올바른 방법 도 사용 합니다.