2017-07-12 9 views
0

Rubyでは、文字列の配列の先頭と末尾の要素を空白にした場合(nilまたは空の文字列のいずれか)、その要素を削除する方法が不思議です。私は文字列を「トリミング」するにはどうすればよいですか?

["", "a", "", "b", nil, ""] 

の配列を持っている場合、私は私が

arr.pop until arr.last || arr.empty? 
を使用して、アレイの右非存在の要素を削除するには、部分的な方法を発見した結果が

["a", "", "b"] 

になりたいです

しかし、それは私の配列の末尾にnilの要素をトリミングするだけで動作するようです。空の文字列に対処したり、空白の要素を配列の前面から削除したりすることはありません。最後とpopと同じことをやっている間ここで

+1

「[XY問題](https://meta.stackexchange.com/q/66377/153968)」のように聞こえます。私はそれがあなたが求めている必要がありますように聞こえるように配列を生成しているものを示すことをお勧めしたいと思います。 –

答えて

1
array. 
drop_while { |element| element.nil? || element.empty? }. 
reverse. 
drop_while { |element| element.nil? || element.empty? }. 
reverse 

あなたが繰り返しを削除する場合:

blank = ->(element) { element.nil? || element.empty? } 

array.drop_while(&blank).reverse.drop_while(&blank).reverse 

あなたが積極的な支援を使用している場合、あなたはそれを直接行うことができます。

array.drop_while(&:blank?).reverse.drop_while(&:blank?).reverse 
+1

'array.drop_while(&ブランク).reverse_each.drop_while(&blank)'がやや良いです。IMO – steenslag

+0

@steenslagなぜあなたはより良い提案ですか? –

+0

@steenslag、私はそれが存在するのを忘れていました(: – ndn

2

は、最初の要素をテストし、shiftとそれを除去することを含む不格好な解決策のようなものです:

list = [nil, "", "a", "", "b", nil, "", nil] 

while ((!list.first or !list.first.match(/\S/)) and list.any?) 
    list.shift 
end 

while ((!list.last or !list.last.match(/\S/)) and list.any?) 
    list.pop 
end 

list 
# => ["a", "", "b"] 

は、空の文字列をRubyでまだ論理的に真であることを忘れないでください文字通りnilまたはfalseではないものになります。 Ruby on Railsを使用している場合、またはActiveSupportを使用している場合は、より厳密なテストである文字列を定義し、少なくとも1つの空白以外の文字を含める必要がある.present?メソッドにアクセスできます。

0
ndx = array.index { |e| !e.to_s.empty? } 
array[ndx..array.rindex { |e| !e.to_s.empty? }] unless ndx.nil? 
    #=> ["a", "", "b"] 

e #=> nilの場合、e.to_s #=> ''

+1

配列が[]の場合はちょうど、上記のエラーは –

+0

良い点。配列に 'nil'と' ''以外のものが含まれていないと問題になりました。 –

関連する問題