【问题标题】:How to split string across new lines and keep blank lines?如何在新行之间拆分字符串并保留空白行?
【发布时间】:2012-08-17 05:27:30
【问题描述】:

给定红宝石代码:

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

这个输出:

["aaaa", "bbbb"] 

我希望输出包含\n\n 指示的空白行——我希望结果是:

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

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

【问题讨论】:

    标签: ruby string split


    【解决方案1】:

    我建议使用 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"
    ]
    

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

    【讨论】:

    • 我喜欢这个答案。我觉得它最清楚地捕捉到了我的意图。
    • 是的,我也更喜欢这个,并且避免了拆分数字参数的讨厌。
    • @shiva,您不能在 MRI 中对 String 使用 map,因为它不是一种方法。也许你正在添加一些扩展 String 的东西?
    • 作为一个 Ruby 人已经六年了,你刚刚教我lines 方法。太棒了,谢谢。
    【解决方案2】:

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

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

    请注意,与您想要的相比,这会给您一个额外的空字符串。

    【讨论】:

    • 哇,文档中该参数的名称并不明显。谢谢指点!
    【解决方案3】:

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

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

    【讨论】: