如何在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 }