按分隔符拆分NSString

问题需求

对一个NSString按照分隔符拆分,分隔符是一个字符串,其中的每一个字符都是是分隔符。例如:@"M100 ,\t 100 150, 100 a50,25 0 0 , 0 150,100 q\n50,-50 70, -170 Z";
分隔符是逗号,空格,\t和\n。
拆分的结果应该是:

M100,
100,
150,
100,
a50,
25,
0,
0,
0,
150,
100,
q,
50,
"-50",
70,
"-170",
Z

分析需求

首先,componentsSeparatedByString是不能满足要求的,因为它的参数是一个固定的分隔符。
然后,componentsSeparatedByCharactersInSet是否可以满足要求呢?咋一看,好像可以的。运行的结果却是:

M100,
"",
"",
"",
"",
"",
"",
100,
// 省略其他结果了

它的运行逻辑是每遇到其中一个分隔符就产生一个分隔结果,于是就产生了很多无用的分隔结果出来了。
虽然,这个分隔结果也勉强可以用,只是在使用的时候需要去掉一些多余的空字符串。实际用起来确实是非常的麻烦。

自己实现一个符合需求的方法

- (NSArray*) splitString:(NSString*)str withDelimiter:(NSString*) delimiter
{
    NSMutableArray* array = [NSMutableArray array];

    NSUInteger len = [str length];
    unichar buffer[len+1];

    [str getCharacters:buffer range:NSMakeRange(0, len)];

    NSCharacterSet* charset = [NSCharacterSet characterSetWithCharactersInString:delimiter];
    int startPosition = 0;
    int length = 0;
    for(int i = 0; i < len; i++)
    {
        if ([charset characterIsMember:buffer[i]])
        {
            if (length>0)
            {
                [array addObject:[str substringWithRange:NSMakeRange(startPosition, length)]];
            }

            startPosition += length+1;
            length = 0;
        }
        else
        {
            length++;
        }
    }
    //add the last part of the string to the array
    [array addObject:[str substringFromIndex:startPosition]];
    return array;
}

Done:)

你可能感兴趣的:(按分隔符拆分NSString)