在大小写更改时拆分字符串

时间:2011-03-30 10:22:53

标签: string split

给一个字符串说“acbXyzKlm”我想把它分成abc,Xyz,Klm。一种天真的方法是遍历字符串并检测案例更改以进行拆分。我想知道是否有更好的算法。

2 个答案:

答案 0 :(得分:5)

要确定字符串中的某个点是否为有效断点,您需要读取断点附近的两个字符。因此,任何解决此问题的算法都需要分析每个角色的情况。

你的算法就是这样做的,因此它在计算上是最优的。任何“更好”的算法都将是一种变体和/或微观优化,具有相同的整体复杂性。

答案 1 :(得分:0)

我今天需要这个,所以我用类别实现了它:

@interface NSString (Extensions)

- (NSString*) spacify;

@end

@implementation NSString (Extensions)

- (NSString*) spacify
{

    // ignore irrelevant strings
    if (self.length < 1)
        return self;

    NSMutableString* result = [NSMutableString stringWithString:self];

    // create a range starting after the first character
    NSRange range;
    range.location = 1;
    range.length = [self length] - 1;

    // match any uppercase character
    NSRegularExpression* r = [NSRegularExpression regularExpressionWithPattern: @"[A-Z]" 
                                                                       options: 0 
                                                                         error: nil];

    // replace matches with the match preceded by a space
    [r replaceMatchesInString: result 
                      options: 0 
                        range: range 
                 withTemplate: @" $0"];
    return [NSString stringWithString:result];
}

@end

试验:

@implementation NSStringExtensionsTest

- (void) testSpacify
{
    NSString* target = @"ThisIsAStringX";
    NSString* expected = @"This Is A String X";
    NSString* actual = [target spacify];
    STAssertEqualObjects(expected, actual, nil);
}

- (void) testSpacify_NoMatches_DoesNothing
{
    NSString* target = @"thisisstring";
    NSString* actual = [target spacify];
    STAssertEqualObjects(target, actual, nil);
}

- (void) testSpacify_EmptyString_DoesNothing
{
    NSString* target = @"";
    NSString* actual = [target spacify];
    STAssertEqualObjects(target, actual, nil);
}

- (void) testSpacify_InvalidLength_DoesNothing
{
    NSString* target = @"A";
    NSString* actual = [target spacify];
    STAssertEqualObjects(target, actual, nil);
}

@end