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

On Mon, Jul 27, 2009 at 6:42 AM, Nik[email protected] wrote:

block acts as the matched string in str; and I can do something to
}
It wouldn’t work.

Thank you for your help!


Robby R.
Chief Evangelist, Partner

PLANET ARGON, LLC
design // development // hosting w/Ruby on Rails

http://robbyonrails.com/
http://twitter.com/planetargon
aim: planetargon

+1 503 445 2457
+1 877 55 ARGON [toll free]
+1 815 642 4068 [fax]

Oh yes, sorry about forgetting that.

original string is
str = “xxxy”

wanted string is
str = “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 = “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 + “>”}
#=>“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!

str = “vvvyxxx”

str =~ /y/

$`
=> “vvv”

$’
=> “xxx”

Like spacecow said. It’s $ Backtick

$` should contain whatever precedes your match

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!

2009/7/29 Nik [email protected]:

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

2009/7/29 Nik So [email protected]:

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

On Wed, Jul 29, 2009 at 12:17 PM, Colin L. [email protected]
wrote:

str = ‘abcydef’

But I cannot act on them, I can only read them.


Nik So


Nik So

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,

On Wed, Jul 29, 2009 at 6:18 AM, Colin L. [email protected]
wrote:

=> “xxx”

Like spacecow said. It’s $ Backtick


Nik So

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.