错误的结果使用componentsSeparatedByString解析objective-C中的字符串

时间:2012-06-12 16:14:09

标签: iphone objective-c xcode

我正在尝试解析字符串 fileString

"contact1;12312312;John\ncontact2;34243442;Bill\n"


NSArray* lines = [fileString componentsSeparatedByString:@"\n"];

在调试器数组中, 3个对象组成。为什么呢?

[行数]必须为2,但为什么它等于3

NSString* line1 = [lines objectAtIndex:0];
NSString* line2 = [lines objectAtIndex:1];
NSString* line3 = [lines objectAtIndex:2];

line1 是“contact1; 12312312; John”。

line2 是“contact2; 34243442; Bill”。

line3 具有类型(_NSCFConstantString *),并且在调试器中不显示值。

后来我使用这个数组作为tableView的数据源,所以我需要一个正确的数组计数。

2 个答案:

答案 0 :(得分:4)

输入字符串有两个分隔符,因此生成的数组有三个条目

  1. 在第一个\ n之前
  2. 在\ n
  3. 之间
  4. 在最后\ n
  5. 之后

    在这种情况下,第三个是空字符串(NSString,长度为0)

    来自NSString documentation

      

    同样,如果字符串以分隔符开头或结尾,则第一个或最后一个子字符串分别为空。

答案 1 :(得分:2)

如果您想在将数组用作数据源之前调整数组,可以使用几种简单的方法来清理数据,例如:

NSString *csvString = @"Joe\nJane\nPaul\n";

// Cleaning by removing last newline
csvString = [csvString stringByReplacingOccurrencesOfString:@"\\n$" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, csvString.length)];

NSArray *lines = [csvString componentsSeparatedByString:@"\n"];

// Cleaning by removing all empty lines
lines = [lines filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]];

您当然只需要其中一项清洁操作,并且可以调整它们以适合您的特定输入数据。