gsub wrapper

H

Hector

Help!

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'
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.

Thanks

Hector
 
E

E. Saynatkari

Hector said:
Help!

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.

Thanks

Hector


E
 
L

Logan Capaldo

Help!

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'
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.

Thanks

Hector

assuming I understand your question:

str = "#{$1}->#{$2}<-#{$3}"

Alternatively:

str = "#$1->#$2<-#$3"
 
T

Timothy Goddard

$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!")
 
R

Robert Klemme

Hector said:
Help!

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'
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.

In your case you don't even need groups, because you can nicely anchor the
expression on word boundaries:
? m.upcase : m) << "<-"}
=> "This ->IS<- a test ->OF<- the emergency"

Otherwise
"#$1->#{upcase ? $2.upcase : $2}<-#$3"}
=> "This ->IS<- a test ->OF<- the emergency"

Note: #$1 in a double quoted string is a shortcut for #{$1}.

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

gsub wrapper re-submitted 0
Wrapper functions 1
gsub and backslashes 15
regex gsub 3
gsub ? 2
Partial GSUB match / replacement 6
Interpolating $1, etc., from within a gsub block 4
simple gsub question \' \` what? 3

Members online

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top