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