Подтвердить что ты не робот

Как загладить первое слово предложения в Objective-C?

Я уже нашел, как использовать все слова предложения, но не только первое слово.

NSString *txt [email protected]"hi my friends!"
[txt capitalizedString];

Я не хочу менять нижний регистр и использовать первый char. Я хотел бы загладить первое слово без изменений других.

4b9b3361

Ответ 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
}