Как сделать заглавными буквами первое слово предложения в Objective-C? - PullRequest
34 голосов
/ 12 марта 2010

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

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

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

Ответы [ 9 ]

118 голосов
/ 12 марта 2010

Вот еще один вариант:

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)
15 голосов
/ 12 июля 2014

Принятый ответ неверен. Во-первых, неправильно воспринимать единицы измерения 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, предоставленный внешним вызовом, в качестве аргумента диапазона.

8 голосов
/ 12 марта 2010

Используйте

- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator

и использовать первый объект в массиве с заглавной буквы, а затем использовать

- (NSString *)componentsJoinedByString:(NSString *)separator

присоединиться к ним обратно

3 голосов
/ 04 июля 2014
pString = [pString
           stringByReplacingCharactersInRange:NSMakeRange(0,1)
           withString:[[pString substringToIndex:1] capitalizedString]];
1 голос
/ 26 февраля 2015

вы можете использовать регулярное выражение, которое я сделал, это работает для меня просто, вы можете вставить ниже код + (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];

0 голосов
/ 11 августа 2015

Я знаю, что этот вопрос требует конкретно ответа 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
}
0 голосов
/ 12 мая 2015

Альтернативное решение в Swift:

var str = "hello"

if count(str) > 0 {
    str.splice(String(str.removeAtIndex(str.startIndex)).uppercaseString, atIndex: str.startIndex)
}
0 голосов
/ 17 декабря 2014

В 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()
0 голосов
/ 12 марта 2010

Ради вариантов я бы предложил:

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 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...