我想轉換這樣的數組:
["apple","banana","pineapple","plum","pear"]
到
I like plum, pineapple, banana, pear *and* apple.
我目前的代碼是這樣的:
%Q{
I like #{%w[apple banana pineapple plum pear].shuffle.yield_self{|q| [q[0..-2].join(", "),q[-1]].join(" and ") }}
}
還有 %w[clever clean 更短高效的 rubyesque].magic() 方法嗎?
我想提供兩種解決方案。兩者都不會改變作為參數傳遞給方法的數組。
arr = ["apple", "banana", "pineapple", "plum", "pear"]
#1
def to_sentence(arr)
*all_but_last, last = arr.shuffle
all_but_last.join(', ') << ' and ' << last
end
to_sentence(arr)
#=> "pear, plum, pineapple, apple and banana"
to_sentence(arr)
#=> "banana, pear, pineapple, plum and apple"
to_sentence(arr)
#=> "banana, plum, apple, pineapple and pear"
to_sentence(arr)
#=> "banana, pineapple, pear, apple and plum"
#2
def to_sentence(arr)
arr.shuffle.join(', ').sub(/,(?!.*,)/, ' and')
end
to_sentence(arr)
#=> "banana, plum, pear, apple and pineapple"
to_sentence(arr)
#=> "pear, plum, pineapple, banana and apple"
to_sentence(arr)
#=> "apple, pineapple, plum, pear and banana"
to_sentence(arr)
#=> "apple, plum, pear, pineapple and banana"
正則表達式匹配字符串中後面沒有跟在另一個逗號後面的逗號(即,它匹配字符串中的最後一個逗號)。(?!.*,)
是一個負面的前瞻。
正則表達式也可以寫成
/.*\K,/
.*
匹配除行終止符以外的任何字符,盡可能多(包括逗號),因為*
默認情況下是greedy。\K
然後將匹配的開頭重置為字符串中的當前位置(就在最後一個逗號之前),並從返回的匹配中丟棄任何先前使用的字符。然後匹配一個逗號,它必然是字符串中的最後一個逗號。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句