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.