Ruby:替换部分包括 $1 $2 $3 并保存在变量中,但使用 gsub 时不会发生插值

问题描述 投票:0回答:1

(a) 我写的代码。

    $str = '909090 aa bb cc dd ee ff 00 12345678 aa bb 12345678 aa bb cc dd ee ff 00 11 22 33 123456 FE 89'
    puts $str
    $str.gsub!(/\s+/, '')

    search_1  = 'aa bb cc dd ee ff 00 (\S{8} aa bb \S{8} aa bb cc dd ee ff 00 11 22 33 \S{6}) (FF|FE) (89)'
    puts search_1
    search_1.gsub!(/\s+/, '')
    replace_1 = '11 22 33 44 55 66 77 $1 $2 $3'
    puts replace_1
    replace_1.gsub!(/\s+/, '')

            repls_1 = [
                    [search_1, replace_1],
            ]


    repls_1.each do |x|
            abc = $str.gsub(Regexp.new(x[0])) {
                            x[1]
                    }
            puts abc
    end

(2)脚本运行结果

  909090 aa bb cc dd ee ff 00 12345678 aa bb 12345678 aa bb cc dd ee ff 00 11 22 33 123456 FE 89
  aa bb cc dd ee ff 00 (\S{8} aa bb \S{8} aa bb cc dd ee ff 00 11 22 33 \S{6}) (FF|FE) (89)
  11 22 33 44 55 66 77 $1 $2 $3

  90909011223344556677$1$2$3

$1、$2、$3 的插值没有发生,有办法解决吗?谢谢。

(i) 我不想使用,但是 $1 $2 $3)

(ii) 模式不止一种,这里仅举一个例子

(iii) 匹配的零件编号不固定,这里是$1$2$3,其他情况也是可能的,例如...$1...$2...$3...$5...,希望代码可以涵盖这一点捕获的零件数量和位置都有变化。

ruby interpolation gsub
1个回答
0
投票

在 Ruby 中,gsub 方法不支持 $1、$2、$3 等在替换字符串中进行插值。但是,您可以在给定 gsub 的块中使用它们,如下所示。尝试修改此代码。

repls_1.each do |x|
    abc = $str.gsub(Regexp.new(x[0])) {
        '11223344556677' + $1 + $2 + $3
    }
    puts abc
end
© www.soinside.com 2019 - 2024. All rights reserved.