如何在Objective-C中将句子的第一个字母大写?

我已经find了如何把这个句子的所有单词大写,但不是只有第一个单词。

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

我不想改变成小写字母,并把首字母大写。 我只想大写第一个字,而不改变其他字。

这是另一个去的地方:

 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) 

被接受的答案是错误的。 首先,从用户期望的angular度来看,将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; }]; 

string的第一个单词可能与第一个string的第一个单词不同。 要确定string的第一个(或每个)句子,然后大写那个(或那些)的第一个单词,然后在外部调用-enumerateSubstringsInRange:options:usingBlock: using NSStringEnumerationBySentences | NSStringEnumerationLocalized NSStringEnumerationBySentences | NSStringEnumerationLocalized 。 在内部调用中,将外部调用提供的substringRange作为rangeparameter passing。

使用

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

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

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

join他们回来

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

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

为了有select的缘故,我build议:

 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来testing这个,但如果我没有记错,你不能使用[myString cStringUsingEncoding:NSUTF8StringEncoding]因为它返回一个const char *

在swift中,你可以像使用这个扩展一样使用它:

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

像这样调用你的string:

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

Swift中的另一个解决scheme:

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

我知道这个问题特别要求Objective C答案,但是这里是Swift 2.0的解决scheme:

 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 }