以大写字母objective-c插入或拆分字符串

时间:2011-09-06 15:39:38

标签: objective-c

在objective-c中将“ThisStringIsJoined”等字符串转换为“This String is Joined”的最有效方法是什么?

我从一个不受我控制的网络服务中收到这样的字符串,我想将数据呈现给用户,所以我想通过在每个大写单词的前面添加空格来整理它。字符串的格式始终为每个单词以大写字母开头。

我对Objective-c很新,所以不能真正想出这个。

由于

6 个答案:

答案 0 :(得分:37)

实现这一目标的一种方法如下:

NSString *string = @"ThisStringIsJoined";
NSRegularExpression *regexp = [NSRegularExpression 
    regularExpressionWithPattern:@"([a-z])([A-Z])" 
    options:0 
    error:NULL];
NSString *newString = [regexp 
    stringByReplacingMatchesInString:string 
    options:0 
    range:NSMakeRange(0, string.length) 
    withTemplate:@"$1 $2"];
NSLog(@"Changed '%@' -> '%@'", string, newString);

这种情况下的输出是:

'ThisStringIsJoined' -> 'This String Is Joined'

您可能希望根据自己的需要调整正则表达式。您可能希望将其转换为NSString上的类别。

答案 1 :(得分:9)

NSRegularExpression是要走的路,但作为琐事,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];
}

答案 2 :(得分:1)

这是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

答案 3 :(得分:1)

这是Swift Code(webstersx的目标c代码),谢谢!

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 Code

答案 4 :(得分:0)

对于那些来到这里寻找类似问题的人来说,在Swift中回答: 也许更干净(添加到Sankalp的答案),以及更多&#39; Swifty &#39;的方法:

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"

从字符串中调用方法:

IsoFields.QUARTER_YEARS

答案 5 :(得分:-1)

您可以尝试创建一个新字符串,该字符串是原始字符串的小写副本。然后比较两个字符串并在字符不同的地方插入空格。

使用NSString方法转为小写。

- (NSString *)lowercaseString