$-variables and regexp


#1

hello,

if i indeed want to start using MatchData instead of the “warts” such
as $-variables in regular expressions, how do i go about writing code
blocks for String#sub et al if i want to get a match for a particular
group?

example:

puts ‘a-b-c-’.gsub(/(.)-/) { $1 + ‘_’ }

thanks
konstantin


#2

ako… wrote:

if i indeed want to start using MatchData instead of the “warts” such
as $-variables in regular expressions, how do i go about writing code
blocks for String#sub et al if i want to get a match for a particular
group?

example:

puts ‘a-b-c-’.gsub(/(.)-/) { $1 + ‘_’ }

This is long, but will do:

puts ‘a-b-c-’.gsub(/(.)-/) { Regexp.last_match[1] + ‘_’ }

It would be very nice if .gsub started yielding the actual MatchData
object in 2.0.


#3

On Dec 15, 2005, at 7:46 PM, ako… wrote:

hello,

if i indeed want to start using MatchData instead of the “warts” such
as $-variables in regular expressions, how do i go about writing code
blocks for String#sub et al if i want to get a match for a particular
group?

example:

puts ‘a-b-c-’.gsub(/(.)-/) { $1 + ‘_’ }

The MatchData object is also placed in a global variable, but I won’t
show it here since it is a punctuation variable and you requested
something different.

Not a direct answer, but you can just use a replacement string in
this case:

‘a-b-c-’.gsub(/(.)-/, ‘\1_’)

Or even no regular expression at all:

‘a-b-c-’.tr(’-’, ‘_’)

Hope that helps.

James Edward G. II


#4

puts ‘a-b-c-’.gsub(/(.)-/) { |str| str + ‘_’ }

i think this is incorrect. id appends an underscore. i need to replace
it.


#5

ako… wrote:

hello,

if i indeed want to start using MatchData instead of the “warts” such
as $-variables in regular expressions, how do i go about writing code
blocks for String#sub et al if i want to get a match for a particular
group?

example:

puts ‘a-b-c-’.gsub(/(.)-/) { $1 + ‘_’ }

puts ‘a-b-c-’.gsub(/(.)-/) { |str| str + ‘_’ }

Though gsub never does give you access to MatchData. MatchData is used
when you do something like this:

matchData = /([[:alpha:]]+):([[:alpha:]]+)/.match(‘abc:xyz’)
=> MatchData
matchData[1]
=> ‘abc’
matchData[2]
=> ‘xyz’


Neil S. - removed_email_address@domain.invalid

‘A republic, if you can keep it.’ – Benjamin Franklin


#6

ako… wrote:

puts ‘a-b-c-’.gsub(/(.)-/) { |str| str + ‘_’ }

i think this is incorrect. id appends an underscore. i need to replace
it.

Ah, sorry, mis-read what yours did.

It appears that gsub has been written to depend on the magic variables,
because it gives you no other means of accessing the MatchData.

So, to use gsub like this and get the MatchData, your guess is as good
as mine as to how to get to it. Just hold down shift and pound on the
keyboard until you guess the right bit of magic punctuation.

Sorry I couldn’t help more,


Neil S. - removed_email_address@domain.invalid

‘A republic, if you can keep it.’ – Benjamin Franklin