【问题标题】:How to replace the captured group in Ruby如何在 Ruby 中替换捕获的组
【发布时间】:2019-11-11 18:26:06
【问题描述】:

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

我正在尝试这样的事情:

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

出了什么问题以及可能的解决方案是什么?

【问题讨论】:

  • 我认为没有正则表达式会更好、更容易。我更新了答案

标签: regex ruby


【解决方案1】:

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

会发生什么:

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

R1L16SB#AA
        ^

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

R1L16SB#BA
        ^   

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

R1L16SC#BA
      ^

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

Ruby demo

【讨论】:

  • @第四只鸟谢谢!有没有一种方法我不需要为新的数组元素重新捕获位置,一旦我捕获了 'packing_val' 的位置,它可以直接替换为 ["A","B","C"] ?截至目前,我正在将字符串与正则表达式匹配并捕获所有数组元素的位置。
  • @code_t 当前答案是针对原始问题的。您可以随时提出新问题,而不是修改问题。也许this pagethis page 会有所帮助。
  • 谢谢!我已经从这个问题中删除了新的查询
【解决方案2】:

您每次迭代都改变了您的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

【讨论】:

  • 谢谢!有没有一种方法我不需要为新的数组元素重新捕获位置,一旦我捕获了 'packing_val' 的位置,它可以直接替换为 ["A","B","C"] ?截至目前,我正在将字符串与正则表达式匹配并捕获所有数组元素的位置。
猜你喜欢
  • 2017-10-13
  • 2011-04-26
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多