Forum: Ruby gsub wrapper

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Hector (Guest)
on 2006-03-03 01:09
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. Saynatkari (Guest)
on 2006-03-03 01:24
Hector wrote:
> 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
Logan C. (Guest)
on 2006-03-03 01:30
(Received via mailing list)
On Mar 2, 2006, at 6:09 PM, Hector wrote:

> # Note: All variables above are set by the user of the program, so I
>
> Hector
>
> --
> Posted via http://www.ruby-forum.com/.
>

assuming I understand your question:

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

Alternatively:

str = "#$1->#$2<-#$3"
Timothy G. (Guest)
on 2006-03-03 03:39
(Received via mailing list)
$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!")
Hector (Guest)
on 2006-03-03 04:30
Timothy G. wrote:

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

Again, thank you for your help.


Hector
Robert K. (Guest)
on 2006-03-03 10:39
(Received via mailing list)
Hector wrote:
> # Note: All variables above are set by the user of the program, so I
>
>   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:

>> upcase=true
=> true
>> 'This is a test of the emergency'.gsub(/\b\w\w\b/) {|m| "->" << (upcase
? m.upcase : m) << "<-"}
=> "This ->IS<- a test ->OF<- the emergency"

Otherwise

>> 'This is a test of the emergency'.gsub(/(\W)+(\w\w)(\W)+/) {|m|
"#$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
This topic is locked and can not be replied to.