我想用数组元素替换捕获的字符串组。
我正在尝试这样的事情:
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
出了什么问题,可能是什么解决方案?
答案 0 :(得分:1)
sub!
将替换循环外part_number
上每次迭代的第一个匹配项。
会发生什么:
在第一次迭代中,第一个A将替换为A并给出相同的
R1L16SB#AA
^
在第二次迭代中,第一个A将被B替换为
R1L16SB#BA
^
在第三次迭代中,第一个B将被C替换
R1L16SC#BA
^
获得所需输出的一种方法是将part_number = 'R1L16SB#AA'
放入循环中。
答案 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