How to split string across new lines and keep blank lines?
I'd recommend using lines
instead of split
for this task. lines
will retain the trailing line-break, which allows you to see the desired empty-line. Use chomp
to clean up:
"aaaa\nbbbb\n\n".lines.map(&:chomp)[ [0] "aaaa", [1] "bbbb", [2] ""]
Other, more convoluted, ways of getting there are:
"aaaa\nbbbb\n\n".split(/(\n)/).each_slice(2).map{ |ary| ary.join.chomp }[ [0] "aaaa", [1] "bbbb", [2] ""]
It's taking advantage of using a capture-group in split
, which returns the split text with the intervening text being split upon. each_slice
then groups the elements into two-element sub-arrays. map
gets each two-element sub-array, does the join
followed by the chomp
.
Or:
"aaaa\nbbbb\n\n".split(/(\n)/).delete_if{ |e| e == "\n" }[ [0] "aaaa", [1] "bbbb", [2] ""]
Here's what split
is returning:
"aaaa\nbbbb\n\n".split(/(\n)/)[ [0] "aaaa", [1] "\n", [2] "bbbb", [3] "\n", [4] "", [5] "\n"]
We don't see that used very often, but it can be useful.