web-dev-qa-db-ja.com

文字列を新しい行に分割して空白行を保持する方法は?

Rubyコード:

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

この出力:

["aaaa", "bbbb"] 

出力に\n\nで示される空白行を含めたい-結果を次のようにしたい:

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

この正確な結果を得るための最も簡単/最良の方法は何ですか?

35
Kirk Woll

このタスクには、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は、要素を2要素のサブ配列にグループ化します。 mapは各2要素サブ配列を取得し、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"
]

これが頻繁に使用されることはありませんが、役に立つ場合があります。

53
the Tin Man

Splitの2番目のパラメーターに負の引数を指定すると、末尾の空の文字列が削除されないようにすることができます。

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

これにより、必要なものと比較して1つの余分な空の文字列が得られることに注意してください。

14
Mark Byers

数値引数を使用できますが、IMOは(IMO)が期待するものと完全に一貫していないため、ややトリッキーです。

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