如何将Objective-C中句子的第一个单词大写?

时间:2010-03-12 11:53:09

标签: objective-c string cocoa nsstring capitalization

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

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

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

9 个答案:

答案 0 :(得分:118)

这是另一个问题:

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 :(得分:15)

接受的答案是错误的。首先,将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;
}];

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

答案 2 :(得分:8)

使用

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

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

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

加入他们

答案 3 :(得分:3)

pString = [pString
           stringByReplacingCharactersInRange:NSMakeRange(0,1)
           withString:[[pString substringToIndex:1] capitalizedString]];

答案 4 :(得分:1)

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

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];

答案 5 :(得分:0)

为了有选择,我建议:

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 *

答案 6 :(得分:0)

在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()

答案 7 :(得分:0)

Swift中的替代解决方案:

var str = "hello"

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

答案 8 :(得分:0)

我知道这个问题专门针对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
}