Как прописать первое слово предложения в Objective-C?
Я уже нашел, как заглавными буквами писать все слова предложения, но не только первое слово.
NSString *txt =@"hi my friends!"
[txt capitalizedString];
Я не хочу переходить на нижний регистр и заглавную букву первого символа. Я хотел бы прописать только первое слово, не меняя остальные.
9 ответов:
Вот еще одна попытка:
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)
Принятый ответ неверен. Во-первых, неправильно рассматривать единицы
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
, предоставленное внешний вызов в качестве аргумента диапазона.
Использовать
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
И заглавной буквы первый объект в массиве, а затем использовать
- (NSString *)componentsJoinedByString:(NSString *)separator
Чтобы присоединиться к ним обратно
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];
Ради того, чтобы иметь варианты, я бы предложил:
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 *
.
В 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()
Альтернативное решение в Swift:
var str = "hello" if count(str) > 0 { str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex) }
Я знаю, что вопрос задает специально для объективного ответа 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 }