我已经找到了如何将句子中的所有单词大写,但不仅仅是第一个单词。
NSString *txt =@"hi my friends!"
[txt capitalizedString];
我不想更改为小写并将第一个字符大写。我想把第一个单词大写,而不改变其他单词。
答案 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
}