From: John Woods Date: 2008-02-23T03:01:08+09:00 Subject: Re: gsub("\\", "\\\\") seems unintuitive Thanks Rob, that's exactly what I was missing -- the second round of escaping is necessary to make escaped references to regex groups work. -----Original Message----- From: Rob Biedenharn Sent: 02/22/2008 09:48 AM > On Feb 22, 2008, at 12:27 PM, John Woods wrote: >> The following confusing behavior is noted in the pickaxe book (2nd ed) >> on page 75: >> >> # I would expect two backslashes in the result >> irb> puts "\\".gsub("\\","\\\\") >> \ >> >> # I would expect four backslashes in the result >> irb> puts "\\".gsub("\\","\\\\\\\\") >> \\ >> >> I can certainly work around it, but it seems unintuitive. Is there a >> reason why gsub behaves this way? Just curious... > > > Notwithstanding the earlier responses... > > Since the replacement string is evaluated 'twice', once as a ruby string > literal and then again by gsub to look for group refrences like '\1', > you need to provide two levels of escaping for a backslash. > > \ is "\\" > so two of them is "\\\\" > and you want gsub to see that so it need to have them escaped: "\\\\\\\\" > > Whew! Yeah, it's unfortunate, but backslash is doing double-duty here: > introducing a group reference to the regular expression and escaping > characters in a string literal (just like "\n", but also itself). > > -Rob > > Rob Biedenharn http://agileconsultingllc.com > Rob@AgileConsultingLLC.com > > >