改行コードを含んだ文字列を分割する場合
ファイルなどから読み込んだ文字列が改行コードを含む複数行だった場合に、これを改行コードを含まない単数行のArray
にしたい…なんて場合があったとします。
Foo
Bar
Baz
これをこんな感じに扱いたいわけです。
["Foo", "Bar", "Baz"]
ある人はこう言います。「componentsSeparatedByString()
」を使えば、綺麗に分割してくれるよ。」
var string = "Foo\rBar\rBuz"
let lines = string.componentsSeparatedByString("\r")
print(lines) // "["Foo", "Bar", "Buz"]
しかし別の人はこう返します。「でも元のテキストの改行コードが"\n"の場合は、分割されないね。さらに"\r\n"の場合は、行頭に"\n"がついちゃう場合があるね?」
var string = "Foo\r\nBar\r\nBuz"
let lines = string.componentsSeparatedByString("\r")
print(lines) // "["Foo", "Bar", "Buz"]
このように、改行コードによる行の分割は、意外と面倒な事がわかります。もちろん力業で文字列をパースして分割しても誰も文句は言いませんが、もう少しすっきりさせたいものです。そんな時は、enumerateLines()
を使うと便利です。
let string = "Foo\rBar\rBuz"
var lines = [String]()
string.enumerateLines { (line, stop) -> () in
lines.append(line)
}
print(lines) // "["Foo", "Bar", "Buz"]
extensionでさらに便利に
このコードをさらに extension にすれば…
extension String {
var lines: [String] {
var lines = [String]()
self.enumerateLines { (line, stop) -> () in
lines.append(line)
}
return lines
}
}
.lines
をつければ、1行毎に分割してArrayにしてくれるので、for-in ループで回してもよし、map
,reduce
,filter
などと組み合わせてもよし。さらに、改行コードはどちらでも、混ざっていても良いので便利です。
"Foo\rBar\rBuz".lines // ["Foo", "Bar", "Buz"]
"Foo\nBar\nBuz".lines // ["Foo", "Bar", "Buz"]
"Foo\r\nBar\r\nBuz".lines // ["Foo", "Bar", "Buz"]
enumerateLines()
を知っていれば、どうって事ないのですが、知っていたのに忘れている場合もありますので、お役に立てれば幸いです。
では、 have a nice coding!