1

ユーザー定義の姓名を含む別のView Controllerに2語の文字列があります

NSString *userName = ([self hasAttributeWithName:kContractorName] ? [self attributeWithName:kContractorName].value : [self.certificate.contractor.name uppercaseString]);

この文字列を別のView Controllerで取得するときに、名のみを抽出したい。

私はスキャナの使用について SO を調査し、ここで非常に役立つ答えを見つけました: Objective C: How to extract part of a String (eg start with '#')、そしてほとんどそこにいます。

問題は、元のコードのバリエーションを使用して 2 番目の名前を抽出することしかできないように見えることです。ファーストネームとセカンドネームの間のスペースまで文字列をスキャンすると、セカンドネームが正常に返されます。2番目の名前ではなく最初の名前を抽出するようにこれを設定する方法について、今すぐちょっとしたことをする必要があります

    NSMutableArray *substrings = [NSMutableArray new];
    NSScanner *scanner = [NSScanner scannerWithString:userName];
    [scanner scanUpToString:@" " intoString:nil]; // Scan all characters before 
    while(![scanner isAtEnd]) {
        NSString *name = nil;
        [scanner scanString:@" " intoString:nil]; // Scan the  character
        if([scanner scanUpToString:@" " intoString:&name]) {
            // If the space immediately followed the , this will be skipped
            [substrings addObject:name];
        }
        [scanner scanUpToString:@" " intoString:nil]; // Scan all characters before next 
    }
4

4 に答える 4

5

NSStringcomponentsSeparatedByString方法を使用することをお勧めします。

NSString* firstName = [userName componentsSeparatedByString:@" "][0];
于 2013-10-06T19:52:09.433 に答える
3

姓と名がスペースで区切られている場合は、次を使用できます。

NSArray *terms = [userName componentsSeparatedByString:@" "];

NSString *firstName = [terms objectAtIndex:0];
于 2013-10-06T19:52:36.377 に答える
1

を使用して、文字列を姓名に分割できますcomponentsSeparatedByString

NSArray *subStrings = [userName componentsSeparatedByString:@" "];
NSString *firstName = [subStrings objectAtIndex:0];
于 2013-10-06T19:52:01.500 に答える
1

確かに、文字列をスペースで分割して最初の要素を取得することはできますが、それのどこが楽しいのでしょうか? NSLinguisticTaggerを試して、実際に Cocoa API を使用してこれを分割します。

__block NSString *firstWord = nil;

NSString *question = @"What is the weather in San Francisco?";
NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames;
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes: [NSLinguisticTagger availableTagSchemesForLanguage:@"en"] options:options];
tagger.string = question;

[tagger enumerateTagsInRange:NSMakeRange(0, [question length]) scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass options:options usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
    firstWord = [question substringWithRange:tokenRange];
    *stop = YES;
}];
于 2013-10-06T20:07:06.387 に答える