【问题标题】:Extract one word from a two word string从两个单词的字符串中提取一个单词
【发布时间】:2013-10-06 19:39:07
【问题描述】:

我在另一个视图控制器中有一个包含用户定义的名字和姓氏的两个单词字符串

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

在另一个视图控制器中检索此字符串时,我想只提取名字。

我研究了有关使用扫描仪的 SO,并在这里找到了一个非常有用的答案:Objective C: How to extract part of a String (e.g. start with '#'),我几乎就在那里。

问题是我似乎只能通过我对原始代码的变体提取第二个名称。我将我的字符串扫描到名字和第二个名字之间的空格,这会很好地返回第二个名字。现在只需要轻推一下如何设置它以提取第一个名字而不是第二个

    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 
    }

【问题讨论】:

  • 你确定没有名字可以包含空格字符吗?

标签: ios objective-c cocoa-touch


【解决方案1】:

最好使用NSStringcomponentsSeparatedByString方法:

NSString* firstName = [userName componentsSeparatedByString:@" "][0];

【讨论】:

  • 谢谢,简单优雅的解决方案
【解决方案2】:

如果名字和姓氏用空格隔开,您可以使用:

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

NSString *firstName = [terms objectAtIndex:0];

【讨论】:

    【解决方案3】:

    您可以使用componentsSeparatedByString 将字符串拆分为名字和姓氏。

    NSArray *subStrings = [userName componentsSeparatedByString:@" "];
    NSString *firstName = [subStrings objectAtIndex:0];
    

    【讨论】:

      【解决方案4】:

      当然,你可以用空格分割字符串并取第一个元素,但那有什么乐趣呢?尝试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;
      }];
      

      【讨论】:

        猜你喜欢
        • 2012-04-13
        • 2015-05-08
        • 2016-09-10
        • 2016-12-27
        • 2021-03-15
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2013-12-12
        相关资源
        最近更新 更多