如何在新行之间拆分字符串并保留空白行?

时间:2012-08-21 19:58:25

标签: ruby string split

鉴于红宝石代码:

"aaaa\nbbbb\n\n".split(/\n/)

输出:

["aaaa", "bbbb"] 

我希望输出包含\n\n指示的空行 - 我希望结果为:

["aaaa", "bbbb", ""]

获得这个确切结果的最简单/最好的方法是什么?

3 个答案:

答案 0 :(得分:52)

我建议您使用lines代替split执行此任务。 lines将保留尾随换行符,这样您就可以看到所需的空行。使用chomp清理:

"aaaa\nbbbb\n\n".lines.map(&:chomp)
[
    [0] "aaaa",
    [1] "bbbb",
    [2] ""
]

其他更复杂的方法是:

"aaaa\nbbbb\n\n".split(/(\n)/).each_slice(2).map{ |ary| ary.join.chomp }
[
    [0] "aaaa",
    [1] "bbbb",
    [2] ""
]

它正在利用split中的捕获组,该捕获组返回拆分文本,其中插入的插入文本。然后each_slice将元素分组为两个元素的子数组。 map获取每个双元素子数组,join后跟chomp

或者:

"aaaa\nbbbb\n\n".split(/(\n)/).delete_if{ |e| e == "\n" }
[
    [0] "aaaa",
    [1] "bbbb",
    [2] ""
]

以下是split返回的内容:

"aaaa\nbbbb\n\n".split(/(\n)/)
[
    [0] "aaaa",
    [1] "\n",
    [2] "bbbb",
    [3] "\n",
    [4] "",
    [5] "\n"
]

我们没有经常使用它,但它可能很有用。

答案 1 :(得分:14)

您可以为split的第二个参数提供负参数,以避免剥离尾随空字符串;

"aaaa\nbbbb\n\n".split(/\n/, -1)

请注意,与您想要的相比,这将为您提供一个额外的空字符串。

答案 2 :(得分:4)

你可以使用数字参数,但IMO它有点棘手,因为(IMO)它与我期望的不太一致,而AFAICT你想要修剪最后一个空字段:

jruby-1.6.7 :020 > "aaaa\nbbbb\n\n".split(/\n/, -1)[0..-2]
 => ["aaaa", "bbbb", ""]