Regexp and using the matched value returned/found.

J

Jean Nibee

Hi

I'm trying to do a regex search and using what I find a key to a Hash to
dig up some formatting info.

But what's happening is the literal \\1 or \\0 (or \1 \0) is not being
resolved to what's being found.

Any help would be awesome.

Ex: (Doesn't work)

# regex looks like this: @swi_start = /SWI((dm)|(ph)|(ty)|(st))st/
// executed in my code:
line.gsub!( swi_start, self.colorize_token( '\\1' ) )
# also not working: line.gsub!( swi_start, self.colorize_token( '\1'
) )

def colorize_token( event )
puts "Event: " << event
return "<font color=\"#{@@color_list[ event ]}\"></font>"
end

Output:
Event: \1

Ex: (This worked!!!)

line.gsub!( swi_start, "#{@red_start}\\1#{@red_end}") then

Output:
<font color="red">dm</font>

Lastly please notes I've tried using " instead of ' in my method call
without any change.
 
H

Heesob Park

Hi,

2009/4/13 Jean Nibee said:
Hi

I'm trying to do a regex search and using what I find a key to a Hash to
dig up some formatting info.

But what's happening is the literal \\1 or \\0 (or \1 \0) is not being
resolved to what's being found.

Any help would be awesome.

Ex: (Doesn't work)

=C2=A0 # regex looks like this: @swi_start =3D /SWI((dm)|(ph)|(ty)|(st))s= t/
=C2=A0 // executed in my code:
=C2=A0 line.gsub!( swi_start, self.colorize_token( '\\1' ) )
=C2=A0 # also not working: line.gsub!( swi_start, self.colorize_token( '\= 1'
) )

=C2=A0 def colorize_token( event )
=C2=A0 =C2=A0 =C2=A0puts "Event: " << event
=C2=A0 =C2=A0 =C2=A0return "<font color=3D\"#{@@color_list[ event ]}\"></= font>"
=C2=A0 end

Output:
Event: \1

Ex: (This worked!!!)

=C2=A0line.gsub!( swi_start, "#{@red_start}\\1#{@red_end}") then

Output:
<font color=3D"red">dm</font>

Lastly please notes I've tried using " instead of ' in my method call
without any change.

You should use block format in that case
Try
line.gsub!(swi_start){colorize_token($1)}
or
line.gsub!(swi_start){|x| colorize_token(x)}


Regards,

Park Heesob
 
R

Robert Klemme

I'm trying to do a regex search and using what I find a key to a Hash to
dig up some formatting info.

But what's happening is the literal \\1 or \\0 (or \1 \0) is not being
resolved to what's being found.

Heesob gave you the solution already but I'd like to add a bit of
explanation why this is the solution.
Any help would be awesome.

Ex: (Doesn't work)

# regex looks like this: @swi_start = /SWI((dm)|(ph)|(ty)|(st))st/

The capturing groups are not needed. This is sufficient:

/SWI(dm|ph|ty|st)st/
// executed in my code:
line.gsub!( swi_start, self.colorize_token( '\\1' ) )

You need to be aware that all method arguments are evaluated *before*
the method is actually invoked. Since you need an argument for
#colorize which depends on the current match this can *never* work
because the #colorize is finished before #gsub! even starts matching.
# also not working: line.gsub!( swi_start, self.colorize_token( '\1'
) )

def colorize_token( event )
puts "Event: " << event
return "<font color=\"#{@@color_list[ event ]}\"></font>"
end

Output:
Event: \1

Ex: (This worked!!!)

line.gsub!( swi_start, "#{@red_start}\\1#{@red_end}") then

No, this does not do the same as you attempted to do with the code above
because in this case the replacement cannot depend on the match. In
other words, you always insert the same color.
Output:
<font color="red">dm</font>

Lastly please notes I've tried using " instead of ' in my method call
without any change.

This is irrelevant in this case as the quote type does not affect the
time of evaluation (see above).

Kind regards

robert
 
J

Jean Nibee

Excellent all

Thank you for the info. Using the block based notation worked much
better. (Also, Robert thank you for the additional info, very
informative).

My next question is:

Can someone direct me to a link to reading materials (my Google skills
seem to stink as I am not finding what I expect) on the pattern matching
variables I can use like $1 mentioned above as I am now trying to match
the WHOLE pattern and not just the "dm,ph,ty,st" portion.

So when I use:

line.gsub!(swi_start){colorize_token($1)}

The $1 only returns the aforementioned 2 char strings, I'd like to get
the whole thing "SWIdmst" or "SWItynd" etc etc.

Thanks.
 
L

lasitha

[...]
Can someone direct me to a link to reading materials (my Google skills
seem to stink as I am not finding what I expect) on the pattern matching
variables I can use like $1 mentioned above as I am now trying to match
the WHOLE pattern and not just the "dm,ph,ty,st" portion.

The keywords seem to be 'ruby pre-defined variables'...
First two hits:
http://is.gd/saBm
http://is.gd/saDy
[...]
The $1 only returns the aforementioned 2 char strings, I'd like to get
the whole thing "SWIdmst" or "SWItynd" etc etc.

$&

solidarity,
lasitha
 

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

Members online

No members online now.

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,189
Latest member
CryptoTaxSoftware

Latest Threads

Top