【问题标题】:How to capitalize the first word of the sentence in Objective-C?Objective-C中如何将句子的第一个单词大写?
【发布时间】:2011-01-26 19:25:13
【问题描述】:

我已经找到了如何将句子的所有单词大写,但不仅仅是第一个单词。

NSString *txt =@"hi my friends!"
[txt capitalizedString];

我不想更改为小写并将第一个字符大写。我想只大写第一个单词而不改变其他单词。

【问题讨论】:

    标签: objective-c string cocoa nsstring capitalization


    【解决方案1】:

    这是另一个尝试:

    NSString *txt = @"hi my friends!";
    txt = [txt stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[txt substringToIndex:1] uppercaseString]];
    

    对于 Swift 语言:

    txt.replaceRange(txt.startIndex...txt.startIndex, with: String(txt[txt.startIndex]).capitalizedString)
    

    【讨论】:

    • 只要确保字符串至少有 1 个字符长,或者当不是这种情况时,您已准备好处理引发的异常。
    • 在将字符串替换为大写字符串之前添加一个 if([txt length] > 1) 检查。
    • @looneydoodle 你的意思是if ([txt length] > 0)。如果长度为 1,它工作正常。
    • 这个答案是错误的。请参阅我的答案以了解正确的方法。
    • 请参阅我的other answer,以 Swift 解决字符串中第一个字符大写的问题。 Ken Thomases 的观点是您需要考虑本地化,我建议他的回答是这就是您所需要的,但在许多情况下这种方法就足够了。
    【解决方案2】:

    接受的答案是错误的。首先,将NSString 的单位视为用户期望的“字符”是不正确的。有代理对。有组合序列。拆分这些会产生不正确的结果。其次,大写第一个字符不一定会产生与大写包含该字符的单词相同的结果。语言可以是上下文相关的。

    做到这一点的正确方法是让框架以适合语言环境的方式识别单词(可能还有句子)。并且还以适合语言环境的方式大写。

    [aMutableString enumerateSubstringsInRange:NSMakeRange(0, [aMutableString length])
                                       options:NSStringEnumerationByWords | NSStringEnumerationLocalized
                                    usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        [aMutableString replaceCharactersInRange:substringRange
                                      withString:[substring capitalizedStringWithLocale:[NSLocale currentLocale]]];
        *stop = YES;
    }];
    

    字符串的第一个单词可能与字符串的第一个句子的第一个单词不同。要识别字符串的第一个(或每个)句子,然后将那个(或那些)的第一个单词大写,然后使用NSStringEnumerationBySentences | NSStringEnumerationLocalized 将上述内容包围在-enumerateSubstringsInRange:options:usingBlock: 的外部调用中。在内部调用中,将外部调用提供的substringRange 作为范围参数传递。

    【讨论】:

    • 如果想将每个单词的首字母大写,只需将最后一行改为*stop = enclosingRange.location + enclosingRange.length == self.length;
    • 如果你想把每个单词都大写,那么根本不需要逐字枚举。这是-capitalizedStringWithLocale: 的默认行为。即使您确实想枚举每个单词,这样做的方法就是永远不要设置*stop。枚举自然会在字符串的末尾结束。 (一般来说,在 Cocoa 的 enumeration-with-block 方法中,你不应该设置 *stop,除非你将它设置为 true。这在并发枚举中最重要,但它在所有情况下的设计合同中。)
    • 对于每个名词都大写的语言,比如德语,这不起作用。它只会大写句子中的第一个单词,而不是每个名词。
    • @keithbhunter,好的,但这不是问题所在。如果有 任何 API 可以针对您提出的情况做正确的事情,我会感到惊讶。
    【解决方案3】:

    使用

    - (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
    

    并将数组中的第一个对象大写,然后使用

    - (NSString *)componentsJoinedByString:(NSString *)separator
    

    加入他们

    【讨论】:

    • 我对 Objective-c 很陌生,但你必须做这么多才能把这个词大写??
    • 是的,只大写第一个单词。不幸的是,Objective-C 不像 Python,每个操作都可以在一行中完成。
    • @Teja:NSString 本身并不支持对字符串中的一个“单词”做某事,无论如何它是一种相当冗长的语言,所以是的。
    【解决方案4】:
    pString = [pString
               stringByReplacingCharactersInRange:NSMakeRange(0,1)
               withString:[[pString substringToIndex:1] capitalizedString]];
    

    【讨论】:

      【解决方案5】:

      你可以使用正则表达式我已经完成了它对我来说很简单你可以粘贴下面的代码 +(NSString*)CaptializeFirstCharacterOfSentence:(NSString*)sentence{

      NSMutableString *firstCharacter = [sentence mutableCopy];
      NSString *pattern = @"(^|\\.|\\?|\\!)\\s*(\\p{Letter})";
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
      [regex enumerateMatchesInString:sentence options:0 range:NSMakeRange(0, [sentence length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
          //NSLog(@"%@", result);
          NSRange r = [result rangeAtIndex:2];
          [firstCharacter replaceCharactersInRange:r withString:[[sentence substringWithRange:r] uppercaseString]];
      }];
      NSLog(@"%@", firstCharacter);
      return firstCharacter;
      

      } //调用这个方法 NsString *resultSentence = [UserClass CaptializeFirstCharacterOfSentence:yourTexthere];

      【讨论】:

        【解决方案6】:

        Swift 中的另一种解决方案:

        var str = "hello"
        
        if count(str) > 0 {
            str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
        }
        

        【讨论】:

        • 什么是拼接?
        • @ArpitBParekh 此代码已过时。在我发布它时它在 Swift 中工作,但 splice 此后被替换。
        • 感谢您的回答@Johan Kool
        【解决方案7】:

        为了有选择,我建议:

        NSString *myString = [NSString stringWithFormat:@"this is a string..."];
        
        char *tmpStr = calloc([myString length] + 1,sizeof(char));
        
        [myString getCString:tmpStr maxLength:[myString length] + 1 encoding:NSUTF8StringEncoding];
        
        int sIndex = 0;
        
        /* skip non-alpha characters at beginning of string */
        while (!isalpha(tmpStr[sIndex])) {
            sIndex++;
        }
        
        toupper(tmpStr[sIndex]);
        
        myString = [NSString stringWithCString:tmpStr encoding:NSUTF8StringEncoding];
        

        我在工作,没有我的 Mac 来测试它,但如果我没记错的话,你不能使用 [myString cStringUsingEncoding:NSUTF8StringEncoding],因为它返回一个 const char *。

        【讨论】:

          【解决方案8】:

          在 swift 中,您可以按照以下方式使用此扩展:

          extension String {
              func ucfirst() -> String {
                  return (self as NSString).stringByReplacingCharactersInRange(NSMakeRange(0, 1), withString: (self as NSString).substringToIndex(1).uppercaseString)
              }    
          }
          

          像这样调用你的字符串:

          var ucfirstString:String = "test".ucfirst()
          

          【讨论】:

            【解决方案9】:

            我知道这个问题专门针对 Objective C 的答案,但是这里是 Swift 2.0 的解决方案:

            let txt = "hi my friends!"
            var sentencecaseString = ""
            
            for (index, character) in txt.characters.enumerate() {
                if 0 == index {
                    sentencecaseString += String(character).uppercaseString
                } else {
                    sentencecaseString.append(character)
                }
            }
            

            或作为扩展:

            func sentencecaseString() -> String {
                var sentencecaseString = ""
                for (index, character) in self.characters.enumerate() {
                    if 0 == index {
                        sentencecaseString += String(character).uppercaseString
                    } else {
                        sentencecaseString.append(character)
                    }
                }
                return sentencecaseString
            }
            

            【讨论】:

              猜你喜欢
              • 2011-07-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-04
              • 1970-01-01
              • 2015-05-30
              • 1970-01-01
              • 2013-04-11
              相关资源
              最近更新 更多