39

ルビーコードを考えると:

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

これは以下を出力します:

["aaaa", "bbbb"] 

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

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

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

4

3 に答える 3

59

このタスクlinesの代わりに使用することをお勧めします。末尾の改行が保持されるため、目的の空行を確認できます。クリーンアップに使用:splitlineschomp

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

あまり頻繁に使用されることはありませんが、便利な場合があります。

于 2012-08-21T20:51:47.743 に答える
14

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

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

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

于 2012-08-21T20:02:33.510 に答える
4

数値引数を使用できますが、(IMO) 私が期待するものと完全に一致していないため、IMO は少しトリッキーです。AFAICT では、最後の null フィールドをトリミングする必要があります。

jruby-1.6.7 :020 > "aaaa\nbbbb\n\n".split(/\n/, -1)[0..-2]
 => ["aaaa", "bbbb", ""] 
于 2012-08-21T20:03:38.033 に答える