Вставить или разбить строку на заглавные буквы - PullRequest
7 голосов
/ 06 сентября 2011

Какой самый эффективный способ преобразовать строку типа «ThisStringIsJoined» в «This String Is Joined» в target-c?

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

Я совершенно новичок в Objective-C, так что не могу понять это.

Спасибо

Ответы [ 6 ]

37 голосов
/ 06 сентября 2011

Один из способов достижения этого:,Возможно, вы захотите сделать это категорией на NSString.

9 голосов
/ 06 сентября 2011

NSRegularExpression s путь, но как мелочи, NSCharacterSet также может быть полезен:

- (NSString *)splitString:(NSString *)inputString {

    int index = 1;
    NSMutableString* mutableInputString = [NSMutableString stringWithString:inputString];

    while (index < mutableInputString.length) {

        if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[mutableInputString characterAtIndex:index]]) {
            [mutableInputString insertString:@" " atIndex:index];
            index++;
        }
        index++;
    }

    return [NSString stringWithString:mutableInputString];
}
1 голос
/ 26 марта 2015

Вот код Swift (код цели c webstersx), спасибо!

var str: NSMutableString = "iLoveSwiftCode"

        var str2: NSMutableString = NSMutableString()

        for var i:NSInteger = 0 ; i < str.length ; i++ {

            var ch:NSString = str.substringWithRange(NSMakeRange(i, 1))
            if(ch .rangeOfCharacterFromSet(NSCharacterSet.uppercaseLetterCharacterSet()).location != NSNotFound) {
            str2 .appendString(" ")
            }
            str2 .appendString(ch)
        }
        println("\(str2.capitalizedString)")

    }

Вывод: я люблю код Swift

1 голос
/ 01 мая 2014

Вот категория на NSString, которая будет делать то, что вы хотите. Это будет обрабатывать не-ASCII буквы. Он также правильно разделит "IDidAGoodThing".

@implementation NSString (SeparateCapitalizedWords)

-(NSString*)stringBySeparatingCapitalizedWords
{
    static NSRegularExpression * __regex ;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSError * error = nil ;
        __regex = [ NSRegularExpression regularExpressionWithPattern:@"[\\p{Uppercase Letter}]" options:0 error:&error ] ;
        if ( error ) { @throw error ; }
    });

    NSString * result = [ __regex stringByReplacingMatchesInString:self options:0 range:(NSRange){ 1, self.length - 1 } withTemplate:@" $0" ] ;
    return result ;
}

@end
0 голосов
/ 23 февраля 2017

Для тех, кто пришел сюда в поисках подобного вопроса, на который ответит Свифт: Возможно, уборщик (добавляя к ответу Санкальпа) и более подход " Swifty ":

func addSpaces(to givenString: String) -> String{
   var string = givenString

   //indexOffset is needed because each time replaceSubrange is called, the resulting count is incremented by one (owing to the fact that a space is added to every capitalised letter)
   var indexOffset = 0
   for (index, character) in string.characters.enumerated(){
       let stringCharacter = String(character)

       //Evaluates to true if the character is a capital letter
       if stringCharacter.lowercased() != stringCharacter{
           guard index != 0 else { continue } //"ILoveSwift" should not turn into " I Love Swift"
           let stringIndex = string.index(string.startIndex, offsetBy: index + indexOffset)
           let endStringIndex = string.index(string.startIndex, offsetBy: index + 1 + indexOffset)
           let range = stringIndex..<endStringIndex
           indexOffset += 1
           string.replaceSubrange(range, with: " \(stringCharacter)")
       }
   }
   return string
}

Вы вызываете функцию следующим образом:

var string = "iLoveSwiftCode"
addSpaces(to: string)
//Result: string = "i Love Swift Code"

В качестве альтернативы, если вы предпочитаете расширения:

extension String{
    mutating func seperatedWithSpaces(){
        //indexOffset is needed because each time replaceSubrange is called, the resulting count is incremented by one (owing to the fact that a space is added to every capitalised letter)
        var indexOffset = 0
        for (index, character) in characters.enumerated(){
            let stringCharacter = String(character)

            if stringCharacter.lowercased() != stringCharacter{
                guard index != 0 else { continue } //"ILoveSwift" should not turn into " I Love Swift"
                let stringIndex = self.index(self.startIndex, offsetBy: index + indexOffset)
                let endStringIndex = self.index(self.startIndex, offsetBy: index + 1 + indexOffset)
                let range = stringIndex..<endStringIndex
                indexOffset += 1
                self.replaceSubrange(range, with: " \(stringCharacter)")
            }
        }
    }
}

Вызов метода из строки:

var string = "iLoveSwiftCode"
string.seperatedWithSpaces()
//Result: string = "i Love Swift Code"
0 голосов
/ 06 сентября 2011

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

Используйте метод NSString для перехода в нижний регистр.

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