Objective-C

NSStringの行分割の落とし穴

More than 5 years have passed since last update.

NSStringを行分割したい。割とある気がします。

手っ取り早く回答が欲しい方は一番下へどうぞ。

しかしこの改行コードはくせ者であり、なかなか面倒な面がある。

まず最初に考えるのは

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

だが当然これはまずい。

なぜなら改行コードは一つではないからだ。

ではこれではどうだろうか

NSArray *lines = [string componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"\r\n"]];

またもっとしっかりと書いて、

NSArray *lines = [string componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

一見すると良さそうに見えるが、これでも良くない。

なぜなら、@"aaa\r\nbbb" などといった文字列がくると、

どうも @"aaa", @"", @"bbb"と3つに分割してしまうのだ。

じゃあ@""のは除外しちゃおう!

というのは非常によくない。

なぜなら除外すると、単なる改行だけの行もなかったことにされてしまうからだ。

するともはや自分で1文字1文字パースしていくしかないんじゃないかとすら思えてくる。

しかし、アップルのドキュメントはしっかり読むべきである。

ずばりなメソッドをつかうのが正解のようだ。

NSMutableArray *lines = [NSMutableArray array];

[string enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
[lines addObject:line];
}];

もし行の途中でやめたくなったら *stop = YES; とポインタを通して通知すればいい。

これでめでたく解決である。