Objective-C에서 NSString을 토큰 화 / 분할하는 가장 좋은 방법은 무엇입니까?
답변
http://borkware.com/quickies/one?topic=NSString (유용한 링크) 에서이를 발견했습니다 .
NSString *string = @"oop:ack:bork:greeble:ponies";
NSArray *chunks = [string componentsSeparatedByString: @":"];
도움이 되었기를 바랍니다!
아담
답변
모든 사람들이 언급 componentsSeparatedByString:
했지만 자연어를 토큰 화 CFStringTokenizer
하는 ( NSString
및 CFString
공백으로 단어를 나누지 않는 중국어 / 일본어와 같이) 상호 교환도 가능합니다.
답변
문자열을 나누려면을 사용하십시오 -[NSString componentsSeparatedByString:]
. 보다 복잡한 토큰 화를 위해서는 NSScanner 클래스를 사용하십시오.
답변
토큰 화 요구가 더 복잡한 경우 오픈 소스 Cocoa String 토큰 화 / 파싱 툴킷 ParseKit을 확인하십시오.
구분 문자 (예 : ‘:’)를 사용하여 문자열을 간단하게 분할하려면 ParseKit이 과도하게 사용됩니다. 그러나 복잡한 토큰 화 요구에 대해 ParseKit은 매우 강력하고 유연합니다.
ParseKit 토큰 화 문서 도 참조하십시오 .
답변
여러 문자를 토큰 화하려면 NSString을 사용할 수 있습니다 componentsSeparatedByCharactersInSet
. NSCharacterSet에는 whitespaceCharacterSet
and와 같은 편리한 사전 제작 세트 가 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 바이트 이상이므로 문자를 열거하는 올바른 방법 도 사용 합니다.