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


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

NSString *txt =@"hi my friends!"
[txt capitalizedString];

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

9 34

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
}