用Ruby正则表达式中的值替换所有匹配项

cfl*_*wis 7 ruby regex

我遇到了一个Ruby字符串替换问题.我正在编写一个我正在使用的有限语言的预处理器,它本身不支持数组,因此我正在自己攻击.

我有一条线:

x[0] = x[1] & x[1] = x[2]
Run Code Online (Sandbox Code Playgroud)

我想用重新格式化的版本替换每个实例:

x__0 = x__1 & x__1 = x__2
Run Code Online (Sandbox Code Playgroud)

该行可能包括其他地方的方括号.

我有一个匹配数组使用的正则表达式:

array_usage = /(\w+)\[(\d+)\]/
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚Ruby构造逐个替换每个实例.我无法使用,.gsub()因为它将匹配该行上的每个实例,并将每个数组声明替换为第一个数组声明..scan()如果您尝试使用.sub()!块内部扫描,则会抱怨正在修改字符串.

任何想法,将不胜感激!

Mar*_*ers 19

实际上你可以使用gsub,你只需要小心使用它:

s = 'x[0] = x[1] & x[1] = x[2]'
s.gsub!(/(\w+)\[(\d+)\]/, '\1__\2')
puts s
Run Code Online (Sandbox Code Playgroud)

结果:

x__0 = x__1 & x__1 = x__2
Run Code Online (Sandbox Code Playgroud)

  • @Lewisham:当你使用双引号时,"\ 1"被解释为ASCII字符1的转义码.当你使用单引号时,字符串被字面解释为反斜杠后跟1,gsub识别. (3认同)
  • 如果你逃脱\ 1,你仍然可以使用双引号.例如"\\ 1 __ \\ 2" (2认同)