给定红宝石代码:
"aaaa\nbbbb\n\n".split(/\n/)
这输出:
["aaaa", "bbbb"]
我希望输出包含由\n\n
-- 我希望结果为:
["aaaa", "bbbb", ""]
获得这个确切结果的最简单/最好的方法是什么?
我建议使用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] ""
]
它利用了使用捕获组 in 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"
]
我们看不到它经常使用,但它可能很有用。
您可以为 split 的第二个参数提供一个否定参数,以避免剥离尾随的空字符串;
"aaaa\nbbbb\n\n".split(/\n/, -1)
请注意,与您想要的相比,这将为您提供一个额外的空字符串。
您可以使用数字参数,但 IMO 有点棘手,因为 (IMO) 它与我的期望不太一致,并且 AFAICT 您想要修剪最后一个空字段:
jruby-1.6.7 :020 > "aaaa\nbbbb\n\n".split(/\n/, -1)[0..-2]
=> ["aaaa", "bbbb", ""]