我有一个正确顺序的字符串数组。我想做这样的事情:
text.gsub!(/my_pattern/, array[i++])
换句话说 - 我想用数组[0]交换my_pattern的第一次出现,用数组[1]交换第二次出现等等。任何提示?
答案 0 :(得分:3)
String#gsub!
接受可选块。块的返回值用作替换字符串。
array = ['first', 'second', 'third', 'forth', 'fifth']
text = 'my_pattern, my_pattern, my_pattern, my_pattern'
text.gsub!(/my_pattern/).each_with_index { |_, i| array[i] }
# => "first, second, third, forth"
答案 1 :(得分:1)
这应该做的工作:
replacements = array.dup
text.gsub!(/my_pattern/) { |_| replacements.shift || 'no replacements left' }
首先使用array.dup
复制数组,因为shift
会修改数组。如果匹配项数多于数组中的元素,则模式将替换为字符串no replacements left
。如果你想保持匹配不变,如果数组中没有剩余元素,只需这样:
text.gsub!(/my_pattern/) { |match| replacements.shift || match }
答案 2 :(得分:1)
一种方式:
array = ['first', 'second', 'third', 'forth', 'fifth']
text = 'my_pattern, my_pattern, my_pattern, my_pattern'
enum = array.to_enum
text.gsub!(/my_pattern/) { enum.next }
#=> "first, second, third, forth"
text
#=> "first, second, third, forth"
如果在到达数组末尾时调用 Enumerator#next将引发StopIterator
异常(即,如果要替换的字符串多于arr
的元素) 。如果您担心这种可能性,则需要rescue
块中的异常并适当地处理它。