Подтвердить что ты не робот

Как разбить строку на новые строки и сохранить пустые строки?

Учитывая код ruby:

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

Выводится:

["aaaa", "bbbb"] 

Я хочу, чтобы на выходе включалась пустая строка, обозначенная \n\n - я хочу, чтобы результат был:

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

Каков самый простой/лучший способ получить этот точный результат?

4b9b3361

Ответ 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"
]

Мы не видим, что это используется очень часто, но это может быть полезно.

Ответ 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", ""]