问题需求
对一个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<NSString*>*) 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:)