Как заменить захваченную группу в Ruby - PullRequest
0 голосов
/ 09 ноября 2019

Я хотел бы заменить захваченную группу строки элементами массива.

Я пытаюсь что-то вроде этого:

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 ]

1 голос
/ 10 ноября 2019

Вы мутировали 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
1 голос
/ 10 ноября 2019

sub! будет заменять первое совпадение при каждой итерации на part_number, которая находится за пределами цикла.

Что происходит:

В первой итерации первая A будет заменена на A, давая тот же

R1L16SB#AA
        ^

Во второй итерации первая A будетзаменяется на B, давая

R1L16SB#BA
        ^   

На третьей итерации первая B будет заменена на C, давая

R1L16SC#BA
      ^

Один из способов получить желаемый результат - поставить part_number = 'R1L16SB#AA'внутри цикла.

Демонстрация Ruby

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...