从数组中获取 gsub 中的占位符以打印

Get placeholder within gsub from array to print

这是我的代码:

  str = "\c 2 foo \v 1 bar \v 2 foo \v 3 bar " +
  "\v 4 foo \c 3 bar \v 1 foo \v 2 bar"

  str.gsub!(/(\c \d+)/, 'CHAPTER SPLIT ')
  #=> CHAPTER SPLIT \c 2 foo \v 1 bar \v 2 foo \v 3 bar \v 4 foo CHAPTER SPLIT \c 3 bar \v 1 foo \v 2 bar

  str.split('CHAPTER SPLIT').map do |s|    
    s.scan(/\c (\d+)/).each {|c| puts s.gsub!(/\v (\d+)/, c.to_s + ':')}
  end

#=>  \c 2 foo ["2"]:1 bar ["2"]:2 foo ["2"]:3 bar ["2"]:4 foo 
#    \c 3 bar ["3"]:1 foo ["3"]:2 bar

我要找的最终结果是

\c 2 foo 2:1 bar 2:2 foo 2:3 bar 2:4 foo 
\c 3 bar 3:1 foo 3:2 bar

一定有比我所做的更简单的方法来做到这一点,我不确定如何从我现在得到的结果中得到它需要的结果。

这里有一个没有 reexp 的解决方案:

str = "\c 2 foo \v 1 bar \v 2 foo \v 3 bar " +
  "\v 4 foo \c 3 bar \v 1 foo \v 2 bar"

x = str.split.slice_before('\c').map do |c_token,chapter,*rest|
  [c_token,chapter]+rest.map.with_index do |x,ix|
    if rest[ix-1] == '\v'
        chapter+':'+x
    else 
        x
    end
  end
end

p x.flatten.join(' ')