如何在Ruby中替换捕获的组

时间:2019-11-09 20:00:01

标签: regex ruby

我想用数组元素替换捕获的字符串组。

我正在尝试这样的事情:

part_number = 'R1L16SB#AA'
regex = (/\A(RM|R1)([A-Z])(\d\d+)([A-Z]+)#?([A-Z])([A-Z])\z/)
g = ["X","Y","Z"]
g.each do |i|
  ren_m,ch_conf,bit_conf,package_type,packing_val,envo_vals = part_number.match(regex).captures
  m = part_number.sub! packing_val,i
  puts m
end

我的数组为g = ["X","Y","Z"]的代码给出期望的输出为:

R1L16SB#XA
R1L16SB#YA
R1L16SB#ZA

捕获的组packing_val被替换为

g = ["X","Y","Z"]

但是当数组中的元素已经存在于字符串中时,它将无法正常工作:

g = ["A","B","C"]

输出:

R1L16SB#AA
R1L16SB#BA
R1L16SC#BA 

但是我的预期输出是:

R1L16SB#AA
R1L16SB#BA
R1L16SB#CA

出了什么问题,可能是什么解决方案?

2 个答案:

答案 0 :(得分:1)

sub!将替换循环外part_number上每次迭代的第一个匹配项。

会发生什么:

在第一次迭代中,第一个A将替换为A并给出相同的

R1L16SB#AA
        ^

在第二次迭代中,第一个A将被B替换为

R1L16SB#BA
        ^   

在第三次迭代中,第一个B将被C替换

R1L16SC#BA
      ^

获得所需输出的一种方法是将part_number = 'R1L16SB#AA'放入循环中。

Ruby demo

答案 1 :(得分:1)

您每次迭代都对part_number进行了变异。这就是原因。

只需切换到sub即可,

m = part_number.sub(packing_val, i)

您可以不使用正则表达式:

part_number = 'R1L16SB#AA'

g = %w[X Y Z]

g.each do |i|
  pn = part_number.dup
  pn[-2] = i
  puts pn
end