after matching a regexp, how can I modify the pre-match string?

Hello All!

I have a string:
str = "xxxy"

and a regular expression:
re=/y/

I know that if I do a gsub!, the variable that gets passed into the
block acts as the matched string in str; and I can do something to
this matched string; so:
str.gsub!(re){|s|
s.upcase
}
#=> "xxxY"

But what can I do to be able to manipulate the pre-match? is it the
$`? I tried
str.gsub!(re){|s|
$`.upcase
}
It wouldn't work.

Thank you for your help!

Can you elaborate on your goal? Taking "xxxy"... what do you want the
string to look like?

Robby

Oh yes, sorry about forgetting that.

original string is
str = "xxxy"

wanted string is
str = "<xxx>y"

but the x's are not constant, the y is constant.

so another sample string can look like
str2 = "abcy"
and the wanted string from it is
str2 = "<abc>y"

So in a more human term, it is, find where y is, and then pointy
bracket whatever precedes y.

And since whatever precedes y always differs from string to string. I
would very much like to match y first, and then say " bracket all that
precedes it"

And one more thing, I read about something called the Lookahead. with
the (?=). And I could have done something like:
str = "xxxy"
re=/(.+)(?=y)/
str.gsub!(re){|s| s = "<" + s + ">"}
#=>"<xxx>y"

While it worked, but in my actual string, I don't know how I can bring
this up clearly -- the string comes from the output of antiword.exe (a
program that extracts text from a word document). And in it, there
contains something like \267 or \306 which the (.+) cannot match even
if I used the u switch for UTF-8. And so I thought, maybe I should
just match y, and then manipulate whatever precedes as I originally
wanted instead of trying to match what precedes y directly.

of course if you know how to match \267, I'd be so glad to learn it,
too! And the thing is, I don't even know what to call a "\267". the
closest to finding a name for it, I found maybe its cousin under
Backlashes in the ruby book. But as to how to match them and what if
there's something else in the future that pops up in the document
that's not of this form, how will I deal with that? It's all very
frustrating.

Thank You!

$` should contain whatever precedes your match

str = "vvvyxxx"

str =~ /y/

$`
=> "vvv"

$'
=> "xxx"

Like spacecow said. It's $ Backtick

Hey guys, thanks for your help!

I found out about $`, $& and $', as well as $1 - $9. But here is still
the problem. They do *find* the "abc" or "xxx" in front of "y"

But I *cannot* act on them, I can only read them.
I am saying, I can't do something like

$` = " <#{$`}>"

these variables seem to be read-only

Any ideas?

Thanks again!

Hey guys, thanks for your help!

I found out about $`, $& and $', as well as $1 - $9. But here is still
the problem. They do *find* the "abc" or "xxx" in front of "y"

But I *cannot* act on them, I can only read them.
I am saying, I can't do something like

$` = " <#{$`}>"

new_string = " <#{$`}>y"

Colin

I see, do you mean that, instead of over-writing my existing string, I should get a new string which consists of

new_str = $` + $’

?

Best,

I see, do you mean that, instead of over-writing my existing string, I
should get a new string which consists of

new_str = $` + $'

I thought you wanted chevrons and the y also. You can overwrite the
existing string if you want to

str = 'abcydef'
str =~ /y/
str = "<#{$`}>y<#{$'}>"
or something similar.

Colin

I did originally want to overwrite the existing string, but the more I think about it, using a new string is better.

Thanks Colin!

Nik

I often use one liners to search and replace within strings:
"my string is a string".gsub(/(st.)/, 'big \1')
=> "my big string is a big string"

Note two important syntax items:
1. put parentheses around the item to be referenced later...
2. Parenthetically captured items are accessible via \1 reference
within the replacement string.