在ruby中用不同的字符串交换每个匹配项

时间:2014-11-02 02:06:06

标签: ruby string gsub

我有一个正确顺序的字符串数组。我想做这样的事情:

text.gsub!(/my_pattern/, array[i++])

换句话说 - 我想用数组[0]交换my_pattern的第一次出现,用数组[1]交换第二次出现等等。任何提示?

3 个答案:

答案 0 :(得分:3)

String#gsub!接受可选块。块的返回值用作替换字符串。

使用Enumerable#each_with_index

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块中的异常并适当地处理它。