How do I get $1, $2, and $3 to get interpolated in the following
snippet?
string = ‘This is a test of the emergency’
regexp = Regexp.new(’(\W)+(\w\w)(\W)+’)
replacement = ‘$1->$2<-$3’
If you have ‘"#{$1}->#{$2}<-#{$3}"’, you can eval
it in the block. This is probably a bad idea, though.
To make this a bit safer, you would probably want the
user to give you some kind of a sprintf-style string
that you format inside the block. This might limit
the user to strictly linear numbering or something.
user_wants_upcase=FALSE
Note: All variables above are set by the user of the program, so I
don’t know
what they will contain before runtime.
string.gsub!(regexp) {
return_value = string # Here, how do I get $1, $2, and $3 to
interpolate?
if (user_wants_uppercase)
return_value.upcase! || return_value
end
return_value
}
I want return_value to be -> ‘This ->is<- a test ->of<- the emergency’
Note: I know that I can get it to work with the non-block version of
gsub! but I need to use the block version.
str = “We love Ruby”
puts str.gsub(/We (\w+) \w+/, ‘Why do we \1 it?’)
puts str.gsub(/(\w+)$/, “it because \1 allows us to do cool stuff!”)
First, thanks to everyone for your input.
But I wanted to be able to invoke ‘gsub’ with end-user specified strings
for both the regex pattern and the replacement string. If the end-user
regex patern contains regexp groupings and the replacement string
contains any of $1, $2, … $9, these variables($1,$2…) will not get
interpolated because they are within a string object. The non-block
version of gsub works fine but I need more flexibility.
Maybe a sample invokation of the script would help explain what I want.
Here’s a sample:
INPUT_STRING = ‘This is getting to be a bear!’
script invokation -> snr.rb -regex’(\W)+(\w\w)(\W)+’
-replacement’$1->$2<-$3’
Should display -> ‘This ->is<- getting ->to<- ->be<- a bear!’
I’m finding it hard to explain exactly what it is I am looking for -
simple concept but difficult for me to explain.
$1 is a global variable which is set to the value matched by the
bracketed bits. You just treat it like any string.
e.g. “The first parameter was #$1” or number = $2.to_f
In gsub substitutions the letters ‘\N’ in the substitution text, where
N is a number from 1 to 9, will be replaced by the substituted
sequence. If you use double quotes, you will need two backslashes
because this is not a normal escape sequence.
str = “We love Ruby”
puts str.gsub(/We (\w+) \w+/, ‘Why do we \1 it?’)
puts str.gsub(/(\w+)$/, “it because \1 allows us to do cool stuff!”)
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.