cflewis
cflewis

Reputation: 7401

Substitute all matches with values in Ruby regular expression

I'm having a problem with getting a Ruby string substitution going. I'm writing a preprocessor for a limited language that I'm using, that doesn't natively support arrays, so I'm hacking in my own.

I have a line:

x[0] = x[1] & x[1] = x[2]

I want to replace each instance with a reformatted version:

x__0 = x__1 & x__1 = x__2

The line may include square brackets elsewhere.

I've got a regex that will match the array use:

array_usage = /(\w+)\[(\d+)\]/

but I can't figure out the Ruby construct to replace each instance one by one. I can't use .gsub() because that will match every instance on the line, and replace every array declaration with whatever the first one was. .scan() complains that the string is being modified if you try and use scan with a .sub()! inside a block.

Any ideas would be appreciated!

Upvotes: 8

Views: 21912

Answers (1)

Mark Byers
Mark Byers

Reputation: 838686

Actaully you can use gsub, you just have to be careful to use it correctly:

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

Result:

x__0 = x__1 & x__1 = x__2

Upvotes: 21

Related Questions