Forum: Ruby $-variables and regexp

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
A70b7da5a3a712e800100e61ef8d8917?d=identicon&s=25 ako... (Guest)
on 2005-12-16 02:59
(Received via mailing list)
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
E0ed615bd6632dd23165e045e3c1df09?d=identicon&s=25 =?ISO-8859-1?Q?Florian_Gro=DF?= (Guest)
on 2005-12-16 03:47
(Received via mailing list)
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.
4299e35bacef054df40583da2d51edea?d=identicon&s=25 James Gray (bbazzarrakk)
on 2005-12-16 04:18
(Received via mailing list)
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 Gray II
3c155ef399326d533efc2eb91ac992e5?d=identicon&s=25 Neil Stevens (Guest)
on 2005-12-17 13:42
(Received via mailing list)
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 Stevens - neil@hakubi.us

'A republic, if you can keep it.' -- Benjamin Franklin
A70b7da5a3a712e800100e61ef8d8917?d=identicon&s=25 ako... (Guest)
on 2005-12-17 13:42
(Received via mailing list)
> puts 'a-b-c-'.gsub(/(.)-/) { |str| str + '_' }

i think this is incorrect. id appends an underscore. i need to replace
it.
3c155ef399326d533efc2eb91ac992e5?d=identicon&s=25 Neil Stevens (Guest)
on 2005-12-18 23:20
(Received via mailing list)
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 Stevens - neil@hakubi.us

'A republic, if you can keep it.' -- Benjamin Franklin
This topic is locked and can not be replied to.